Rails:使用"attributes"方法将属性从对象复制到另一个对象

Lau*_*ura 16 ruby activerecord ruby-on-rails

让模型Quote具有属性[price, description]

让模型Invoice具有属性[price, description, priority]

invoiceModel中的对象Invoice具有属性{price: 10, description: 'lamp', priority: 10}

invoice = {price: 10, description: 'lamp', priority: 10}
Run Code Online (Sandbox Code Playgroud)

假设我想将invoice属性复制到新的quote.

quote = Quote.new(invoice.attributes)
Run Code Online (Sandbox Code Playgroud)

这会引发priority模型中不存在的错误Quote.

如何将invoice属性复制到新的quote但只能quote接受的属性?

And*_*all 20

select只能Quote拥有以下属性:

Quote.new(invoice.attributes.select{ |key, _| Quote.attribute_names.include? key })
Run Code Online (Sandbox Code Playgroud)

正如@aceofspades所说(但不是动态解决方案),您也可以使用ActiveSupport slice:

Quote.new(invoice.attributes.slice(*Quote.attribute_names))
Run Code Online (Sandbox Code Playgroud)

  • 只传递数组返回{},使用下面的一个!Quote.new(invoice.attributes.slice(*Quote.attribute_names)) (3认同)

ace*_*des 13

来自ActiveSupport的切片方法怎么样?

quote = Quote.new(invoice.attributes.slice(:price, :description))
Run Code Online (Sandbox Code Playgroud)

甚至

quote = Quote.new(invoice.attributes.slice(*Quote.accessible_attributes))
Run Code Online (Sandbox Code Playgroud)