2012-04-21 2 views
0

У меня есть модель ActiveRecord @new_profile, у которой есть некоторые, но не все ее свойства. Я имею еще одну модель @default_profile, которая имеет кучу значений, которые я хочу скопировать, но только если свойства от первого не заполнены. есть встроенный способ сделать это, кроме как блок ...Заполните незаполненные свойства с помощью другой модели

@new_profile.name ||= @default_profile.name 
@new_profile.address ||= @default_profile.address 
# etc. 

ответ

0

Вы могли бы попробовать что-то вроде

@new_profile.attributes = @new_profile.attributes.reverse_merge @default_profile.attributes 
0
@new_profile.update_attributes(@default_profile.attributes.merge(@new_profile.attributes)) 
1

Это может работать

@new_profile.update_attributes!(@default_profile.attributes.merge(@new_profile.attributes)) 

Проблема с этим, что если атрибут в @new_profile, но это ноль, слияние может оставить значение, установленное в ноль. Возможно, вам придется сделать следующее.

new_profile_attrs = @new_profile.attributes.reject{ |key,value| !value } 
@new_profile.update_attributes!(@default_profile.attributes.merge(new_profile_attrs)) 
0

Если вам нужно скопировать все атрибуты (кроме id конечно):

@new_profile.attributes.each{|k,v| @new_profile[k] ||= @default_profile[k] if k != 'id'} 

вещи, как update_attributes не позволит скопировать attr_protected -attributes. Эта вещь должна.