Rails:使用“attributes”方法将属性从对象复制到另一个对象
让模特Quote
有属性[price, description]
让模型Invoice
有属性[price, description, priority]
让我们使用属性{price: 10, description: 'lamp', priority: 10}
从Model Invoice
为对象invoice
invoice = {price: 10, description: 'lamp', priority: 10}
假设我想将invoice
属性复制到新quote
。
quote = Quote.new(invoice.attributes)
这引发了一个错误,即模型Quote
中不存在priority
。
如何将invoice
属性复制到新quote
但只复制quote
可以接受的属性?
您只能select
Quote
具有的属性:
Quote.new(invoice.attributes.select{ |key, _| Quote.attribute_names.include? key })
正如@aceofspades所说 (但不是动态解决方案),您也可以使用ActiveSupport的slice
:
Quote.new(invoice.attributes.slice(*Quote.attribute_names))
来自ActiveSupport的切片方法怎么样?
quote = Quote.new(invoice.attributes.slice(:price, :description))
甚至
quote = Quote.new(invoice.attributes.slice(*Quote.accessible_attributes))
直截了当的方式是这样的:
source = invoice.attributes target = (source.keys & Quote.attribute_names).inject({}) {|target, key| target[key] = source[key]; target } quote = Quote.new(target)