0

@new_profile一部のプロパティが入力されているが、すべてのプロパティが入力されていないActiveRecord モデルがあります。@default_profileコピーしたい値の束を持つ別のモデルがありますが、最初のプロパティが入力されていない場合に限ります。のようなブロック以外にこれを行う方法が組み込まれています...

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

4 に答える 4

1

これはうまくいくかもしれません

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

これに関する問題は、属性が @new_profile にあるが、それが nil である場合、マージによって値が nil として設定されたままになる可能性があることです。次の操作が必要になる場合があります。

new_profile_attrs = @new_profile.attributes.reject{ |key,value| !value }
@new_profile.update_attributes!(@default_profile.attributes.merge(new_profile_attrs))
于 2012-04-21T19:01:35.323 に答える
0

次のようなものを試すことができます

@new_profile.attributes = @new_profile.attributes.reverse_merge @default_profile.attributes
于 2012-04-21T18:57:54.043 に答える
0
@new_profile.update_attributes(@default_profile.attributes.merge(@new_profile.attributes))
于 2012-04-21T19:01:18.463 に答える
0

すべての属性をコピーする必要がある場合 (idもちろん除く):

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

-attributesupdate_attributesをコピーすることはできませんattr_protectedこのことはすべきです。

于 2012-04-21T20:01:34.870 に答える