Rails 4 has_many nested_attributes来替换所有

我想使用nested_attributes来替换所有旧的关联对象。 最好的方法是怎样做的?

如果我使用下面的代码,每次使用nested_attributes更新主对象时,都会创建关联的新对象。

accepts_nested_attributes_for :days 

编辑

我在下面的before_validation回调中得到了它:

 def replace_days db_days = days.where('id IS NOT NULL') all_days = days all_days -= db_days self.days = all_days end 

问题在于我对子模型的独特validation。 Rails将进入数据库以validation唯一性。 由于在validation时我的替换不在数据库上,因此得到了validation错误。 不知道如何绕过这个,如果这是最好的方法。 我希望rails有一些本机function或参数可以帮助我完全按照自己的意愿行事。

这是我能得到的最好的:

 def days_attributes=(*attrs) self.days = [] super(*attrs) end 

希望还不算太晚。

添加reject_if选项,如下所示:

 accepts_nested_attributes_for :days, reject_if: :all_blank 

这应该可以防止您描述的行为。