尝试找出关于活动记录关联是否应该在attr_accessible属性列表中的确定答案。
我见过
class Foo
attr_accessible :name
attr_accessible :bars
belongs_to :bar
end
也见过
attr_accessible :bars_id
想知道能够做Foo.new的正确方法(名称:'name'bar:barvar)
答案 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
可访问以使事务与关系一起工作。