我有一个 ActiveRecord 模型@new_profile
,它填充了一些但不是所有属性。我有另一个模型@default_profile
,它有一堆我想复制的值,但前提是第一个属性没有填充。有没有除了像...这样的块之外,还内置了这样做的方法
@new_profile.name ||= @default_profile.name
@new_profile.address ||= @default_profile.address
# etc.
我有一个 ActiveRecord 模型@new_profile
,它填充了一些但不是所有属性。我有另一个模型@default_profile
,它有一堆我想复制的值,但前提是第一个属性没有填充。有没有除了像...这样的块之外,还内置了这样做的方法
@new_profile.name ||= @default_profile.name
@new_profile.address ||= @default_profile.address
# etc.
这可能有效
@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))
你可以尝试类似的东西
@new_profile.attributes = @new_profile.attributes.reverse_merge @default_profile.attributes
@new_profile.update_attributes(@default_profile.attributes.merge(@new_profile.attributes))
如果您需要复制所有属性(id
当然除外):
@new_profile.attributes.each{|k,v| @new_profile[k] ||= @default_profile[k] if k != 'id'}
诸如update_attributes
不允许您复制-属性之类的东西attr_protected
。这东西应该。