Rails: Копирование атрибутов из объекта в другой, используя метод "attribute" - PullRequest
16 голосов
/ 06 марта 2012

Пусть модель Quote имеет атрибуты [price, description]

Пусть модель Invoice имеет атрибуты [price, description, priority]

Пусть invoice объект из модели Invoice с атрибутами {price: 10, description: 'lamp', priority: 10}

invoice = {price: 10, description: 'lamp', priority: 10}

Допустим, я хочу скопировать invoice атрибутов в новый quote.

quote = Quote.new(invoice.attributes)

Это вызывает ошибку, которой priority не существует в модели Quote.

Как мне скопировать invoice атрибуты в новый quote, но только те атрибуты, которые quote может принять?

Ответы [ 3 ]

20 голосов
/ 06 марта 2012

Вы можете select только те атрибуты, которые Quote имеет:

Quote.new(invoice.attributes.select{ |key, _| Quote.attribute_names.include? key })

Как отмечено @ aceofspades (но не с динамическим решением), вы также можете использовать ActiveSupport slice:

Quote.new(invoice.attributes.slice(*Quote.attribute_names))
13 голосов
/ 06 марта 2012

Как насчет метода среза из ActiveSupport?

quote = Quote.new(invoice.attributes.slice(:price, :description))

или даже

quote = Quote.new(invoice.attributes.slice(*Quote.accessible_attributes))
0 голосов
/ 06 марта 2012

Прямой путь примерно такой:

source = invoice.attributes
target = (source.keys & Quote.attribute_names).inject({}) {|target, key| target[key] = source[key]; target }
quote = Quote.new(target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...