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)