我想使用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
问题在于我对子模型的独特验证。 Rails将进入数据库以验证唯一性。由于在验证时我的替换不在数据库上,因此得到了验证错误。不知道如何绕过这个,如果这是最好的方法。我希望rails有一些本机功能或参数可以帮助我完全按照自己的意愿行事。
答案 0 :(得分:1)
这是我能得到的最好的:
def days_attributes=(*attrs)
self.days = []
super(*attrs)
end
希望还不算太晚。
答案 1 :(得分:0)
添加reject_if
选项,如下所示:
accepts_nested_attributes_for :days, reject_if: :all_blank
这可以防止您描述的行为。