【问题标题】:has_many + accepts_nested_attributes_for + :update_only => truehas_many + accept_nested_attributes_for + :update_only => true
【发布时间】:2016-01-05 04:57:10
【问题描述】:

据我所知,update_only 不适用于 has_many 关联。

我正在更新嵌套属性,它每次都会创建新的孩子,并且不会删除旧的孩子。在每次更新时自动删除它们的好方法是什么(模仿适用于 has_one 的 :update_only 行为)?

我知道 :allow_destroy。但是,我没有孩子的 id 让 rails 知道应该销毁什么。

附:我最初在 2012 年问了这个问题,然后我找到了一个 hacky 解决方案来覆盖 assign_nested_attributes_for_collection_association。我想知道 Rails 中是否引入了任何东西来解决这个问题。它看起来像非常常见的简单案例。我想知道为什么有一个内置的解决方案。

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    我发现的最佳方法是覆盖对象上的 assign_nested_attributes_for_collection_association 方法,在其中检查关联类型。如果是 has_many,则对这个关联执行 destroy_all。

    这样的代码可以被泛化并移动到一个模块中以供进一步重用。

    【讨论】:

    • 顺便说一句。这个解决方案在 Rails 4 中变得更加成问题。看起来 assign_nested_attributes_for_collection_association 变得更加复杂,因此在处理所有场景时更难覆盖。
    【解决方案2】:

    这两个问题中提到的镇上似乎有更好的解决方案:

    解决办法是

    def foo_attributes=(*attrs)
      self.foo.clear
      super(*attrs)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多