使用其他型号填写未填充的属性

时间:2012-04-21 18:42:35

标签: ruby-on-rails ruby activerecord ruby-on-rails-3.1

我有一个ActiveRecord模型@new_profile,其中包含一些但不是所有属性。我有另一个模型@default_profile,它有一堆我要复制的值,但仅限于第一个属性没有被填充。除了像......这样的块之外,还有内置的方法吗?

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

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

您可以尝试类似

的内容
@new_profile.attributes = @new_profile.attributes.reverse_merge @default_profile.attributes

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您需要复制所有属性(当然除了id):

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

update_attributes之类的内容不允许您复制attr_protected - 属性。 这件事