Let model Quote have attributes [price, description]
Let model Invoice have attributes [price, description, priority]
Let invoice an object from Model Invoice with attributes {price: 10, description: 'lamp', priority: 10}
invoice = {price: 10, description: 'lamp', priority: 10}
Let's say I want to copy invoice attributes to a new quote.
quote = Quote.new(invoice.attributes)
This raises an error that priority does not existe in model Quote.
How do I copy invoice attributes to a new quote but only the attributes that a quote can accept?
You can select only the attributes that Quote has:
Quote.new(invoice.attributes.select{ |key, _| Quote.attribute_names.include? key })
As noted by @aceofspades (but not with a dynamic solution), you can use ActiveSupport's slice as well:
Quote.new(invoice.attributes.slice(*Quote.attribute_names))
How about the slice method from ActiveSupport?
quote = Quote.new(invoice.attributes.slice(:price, :description))
or even
quote = Quote.new(invoice.attributes.slice(*Quote.accessible_attributes))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With