Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4有许多嵌套的属性来替换所有属性_Ruby On Rails_Ruby_Ruby On Rails 4_Nested Attributes - Fatal编程技术网

Ruby on rails Rails 4有许多嵌套的属性来替换所有属性

Ruby on rails Rails 4有许多嵌套的属性来替换所有属性,ruby-on-rails,ruby,ruby-on-rails-4,nested-attributes,Ruby On Rails,Ruby,Ruby On Rails 4,Nested Attributes,我想使用嵌套的_属性将所有旧关联对象替换为新对象。最好的方法是什么 如果使用下面的代码,每次使用嵌套的_属性更新主对象时,都会创建新的关联对象 accepts_nested_attributes_for :days 编辑 我通过下面的验证前的回调得到了它: def replace_days db_days = days.where('id IS NOT NULL') all_days = days all_days -= db_days self.days = all_da

我想使用嵌套的_属性将所有旧关联对象替换为新对象。最好的方法是什么

如果使用下面的代码,每次使用嵌套的_属性更新主对象时,都会创建新的关联对象

accepts_nested_attributes_for :days
编辑

我通过下面的
验证前的回调得到了它:

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有一些本机函数或参数,可以帮助我完成我想要的工作。

添加一个
reject\u if
选项,如下所示:

accepts_nested_attributes_for :days, reject_if: :all_blank

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

这是我能得到的最好结果:

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

希望还不算太晚。

我不知道自己是否足够清楚,我需要将所有旧的
days
替换为嵌套属性中的
days