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
这应该可以防止您描述的行为。