繁体   English   中英

设置Rails模型属性顺序

[英]Setting Rails model attributes order

在定义依赖于另一个要设置的方法的虚拟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将构建一个嵌套实例,然后设置属性。 当要设置名称时,实例将存在并且将设置嵌套属性。

有一个类似的问题,我来到以下合理的通用解决方案:

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和提取的param值首先需要设置确保你处理属性赋值的所有奇怪的特殊情况(它是一个引用吗?一个参数哈希?一个多值参数?)。 使用散列的部分重复调用assign_attributes应该具有与使用整个散列调用一次相同的效果 - 这应该是相当安全的。

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

def attributes=(attrs)
    self[:dont_set_name] = attrs.delete(:dont_set_name)
    super
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM