Rails 3.2.x关联和attr_accessible

时间:2013-01-07 15:52:33

标签: ruby-on-rails rails-activerecord

尝试找出关于活动记录关联是否应该在attr_accessible属性列表中的确定答案。

我见过

class Foo

  attr_accessible :name
  attr_accessible :bars

  belongs_to :bar
end

也见过

  attr_accessible :bars_id

想知道能够做Foo.new的正确方法(名称:'name'bar:barvar)

3 个答案:

答案 0 :(得分:4)

通常最终的答案是:“它取决于”

只有您要批量分配的属性才可以访问。

所以,如果你想要或需要做...

Foo.new(name: 'name', bar: barvar)

...然后您只需必须使bar可访问。

最后调用assign_attributes,在检查属性的可访问性后执行简单的send("#{attribute_name}=", attribute_value)

一些编码风格方面:

通常在处理param哈希时发生质量分配。至少那是安全问题潜伏的地方。在那里,您很少有Bar个对象,但更常见的是bar_id

但是,如果您使用模型实例,大多数人更喜欢使用关联方法(如@Andrew Nesbitt所写),因为这通常具有一些优点(自动保存,自动更新关联对象,更清晰的代码,......)

因此有理由拥有一个或另一个或两者。

我的个人观点:不应该在这个主题上浪费大量时间,因为Rails 4.0将有a better solution用于参数清理。 (如果你想在Rails 3中使用它,请参见strong_parameters

答案 1 :(得分:1)

您可以避免使用关联构建器来访问bar_id:

# singular (has_one)
foo = bar.build_foo(name: 'name')

# plural (has_many)
foo = bar.foos.build(name: 'name')

如果您使用accepts_nested_attributes,则唯一需要使关联可访问的时间。

答案 2 :(得分:0)

虽然您可以避免在示例中访问bars_id(不应该是bar_id?),但问题是您的应用程序的某些部分是否仍需要访问它。使用active_admin,我必须使whatever_id可访问以使事务与关系一起工作。