Rails 4 has_many nested_attributes替换所有

时间:2015-02-18 18:55:24

标签: ruby-on-rails ruby ruby-on-rails-4 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

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

2 个答案:

答案 0 :(得分:1)

这是我能得到的最好的:

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

希望还不算太晚。

答案 1 :(得分:0)

添加reject_if选项,如下所示:

accepts_nested_attributes_for :days, reject_if: :all_blank

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