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)
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)