Rails - 为什么`accepts_nested_attributes_for`将`autosave`设置为true

时间:2013-09-09 16:50:19

标签: ruby-on-rails-3 rails-activerecord

在Ruby on Rails中,如果在模型中声明accepts_nested_attributes_for,则autosave对于子关联设置为true。这有必要吗?

根据我的理解,Rails已经在不声明autosave: true的情况下验证了所有新的和已更改的孩子。似乎这将涵盖您接受子关联的嵌套属性的所有情况。但是,使用autosave: true,每次保存父级时,孩子都会得到验证,即使孩子未更改

这可能会产生重大意想不到的后果,例如,如果您修改子模型的方式使得大量记录无效。

2 个答案:

答案 0 :(得分:1)

尝试在关联上设置validate: false。您可以在http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html看到激活autosave(在我们的情况下通过accepts_nested_attributes_for)始终验证记录,除非您使用validate: false

答案 1 :(得分:0)

好问题!我自己也遇到了这个惊喜。

我认为Rails只会在自动保存为零(默认值)时保存/验证新的子记录。

save_belongs_to_association(reflection)中,如果记录或autosave已启用,它似乎只会保存相关记录。

      saved = record.save(:validate => !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)

我总是发现自动保存选项有点令人困惑/不一致......但是现在我们可能因为向后兼容原因而坚持使用它......