7

在定义依赖于要设置的另一种方法的虚拟设置方法时,似乎在哈希中设置属性的顺序很重要。有没有办法在仍然大量分配属性的同时解决这个问题?

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 将构建一个嵌套实例,然后设置属性。当要设置名称时,实例将存在并设置嵌套属性。

4

2 回答 2

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确实应该与用整个散列调用一次具有相同的效果——这应该是相当安全的。

于 2014-01-24T20:03:23.120 回答
0

我现在能想到的唯一解决方案是覆盖属性设置器......

def attributes=(attrs)
    self[:dont_set_name] = attrs.delete(:dont_set_name)
    super
end
于 2012-09-05T03:03:26.527 回答