2012-04-11 2 views
4

Это было задано частично раньше, и я нашел следующее clip о том, как установить атрибуты объекта класса одновременно, но это невозможно с помощью Rails из-за защиты массового присвоения. (например, вы не можете Object.attributes = {})Хороший способ объединить/скопировать атрибуты между двумя классами ActiveRecord?

Есть ли хороший способ объединить атрибуты из одного класса в другой?

object1.attributes = object2.attributes.inject({}){ |h,(k,v)| 
    h[k]=v if ObjectModel.column_names.include?(k); h 
} 

Спасибо.

+0

Я не уверен, что понял вопрос, то вы можете с уверенностью сказать, 'object1.attributes = object2.attributes', но только доступные атрибуты на object1 будут установлены из атрибутов Object2, вы просто пытаетесь для обхода attr_accessible (защита массового присвоения)? –

+0

На самом деле у меня есть 3 атрибута, которые я хочу скопировать как attr_accessible, но они фактически не копируются. Я использую RubyMine для отладки объектов, и даже после предполагаемой успешной копии они все еще не настроены на значения второго объекта sttribute. – garlicman

ответ

11

Использовать assign_attributes с опцией :without_protection.

attributes = object2.attributes.select do |attr, value| 
    ObjectModel.column_names.include?(attr.to_s) 
end 
object1.assign_attributes(attributes, :without_protection => true) 
+2

и немного более чистый способ получить атрибуты из объекта2: 'attributes = object2.attributes.select {| attr, value | ObjectModel.column_names.include? (Attr.to_s)} ' –

+0

Спасибо @PatrickKlingemann, я обновил, чтобы включить ваши изменения. –

+0

Мне нравится do/end в этом случае тоже, хорошо сыграно. –

Смежные вопросы