代码之家  ›  专栏  ›  技术社区  ›  Santiago Palladino

如何处理ActiveRecord嵌套属性的更新回调之前的新子级

  •  4
  • Santiago Palladino  · 技术社区  · 15 年前

    我有一个模型对象(比如父对象),它与另一个模型对象(子对象)有许多关联。

    class Parent < ActiveRecord::Base
        has_many :children
        accepts_nested_attributes_for :children
    end
    
    class Child < ActiveRecord::Base
        belongs_to :parent
    end
    

    在parent上,我想在before-update回调中添加代码,以根据其子级设置计算属性。

    我遇到的问题是,当我使用parent.update(id,atts)方法,为新的子级添加atts时,在更新之前(self.children返回旧的集合),添加到atts集合中的atts不可用。

    是否有任何方法可以在不干扰接受嵌套属性的情况下检索新的属性?

    1 回复  |  直到 15 年前
        1
  •  3
  •   EmFi    15 年前

    你所描述的对我来说适用于Rails 2.3.2。我认为你可能没有恰当地分配给父母的孩子。更新后是否更新了子级?

    接受\u嵌套的\u属性\用于在父级上创建子级\u属性编写器。我有一种感觉,你在试图更新:儿童,而不是:儿童属性。

    这可以使用您的模型,如下所述,然后再进行更新回调:

    before_update :list_childrens_names
    def list_childrens_names
      children.each{|child| puts child.name}
    end
    

    控制台中的这些命令:

    Parent.create # => Parent(id => 1)
    Parent.update(1, :childrens_attributes => 
      [{:name => "Jimmy"}, {:name => "Julie"}]) 
    

    生成此输出:

    Jimmy
    Julie