【问题标题】:Rails 4 has_many nested_attributes to replace allRails 4 has_many nested_attributes 替换所有
【发布时间】:2015-02-18 18:55:23
【问题描述】:

我想使用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 有一些原生函数或参数,可以帮助我做我想做的事。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 nested-attributes


    【解决方案1】:

    这是我能得到的最好的:

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

    希望还不算太晚。

    【讨论】:

      【解决方案2】:

      添加reject_if 选项,如下所示:

      accepts_nested_attributes_for :days, reject_if: :all_blank
      

      这应该会阻止您描述的行为。

      【讨论】:

      • 不知道我是否清楚,我需要将所有旧的days 替换为嵌套属性中的days
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2014-09-22
      相关资源
      最近更新 更多