当定义依赖于另一个要设置的方法的虚拟setter方法时,似乎在哈希中设置的属性的顺序很重要。有没有办法围绕这个仍然大规模分配属性?
https://gist.github.com/3629539
修改
实际代码中的条件(未在示例中显示)检查是否存在关联对象。如果对象存在,请设置一个值。如果没有,请忽略传入的值。但是,我也使用accepts_nested_attributes_for。因此,属性哈希可以包含关联的属性。在这种情况下,对象将存在。
{:name => 'Fred', :nested_attributes => {:color => 'red'}}
不会设置名称,因为模型不存在。
{:nested_attributes => {:color => 'red'}, :name => 'Fred'}
accepts_nested_attributes_for将构建一个嵌套实例,然后设置属性。当要设置名称时,实例将存在并且将设置嵌套属性。
答案 0 :(得分:2)
有一个类似的问题,我得出了以下合理的通用解决方案:
def assign_attributes(new_attributes)
assign_first = new_attributes.extract!(:must_be_set_first, :must_also_be_set_first)
super(assign_first) unless assign_first.empty?
super(new_attributes)
end
将super
与首先需要设置的提取的参数值一起使用可确保您处理属性赋值的所有奇怪特殊情况(它是一个引用吗?一个参数哈希?一个多值参数?)。使用哈希部分重复调用assign_attributes
实际上应该具有与使用整个哈希调用它一次相同的效果 - 这应该是相当安全的。
答案 1 :(得分:0)
我现在能想到的唯一解决方案是覆盖属性setter ......
def attributes=(attrs)
self[:dont_set_name] = attrs.delete(:dont_set_name)
super
end