如何在active_ord嵌套属性的before_update回调中处理新子节点

时间:2010-01-07 14:49:44

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

我有一个模型对象(比如说是Parent),在另一个模型对象(Child)上有一个has_many关联。

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时,在at_update中添加的atts集合中的那些不可用(self.children返回老收藏品。)

有没有办法在不弄乱accepts_nested_attributes_for的情况下检索新的?

1 个答案:

答案 0 :(得分:3)

您所描述的内容适用于Rails 2.3.2。我想你可能没有正确地分配给父母的孩子。更新后儿童是否更新?

accepts_nested_attributes_for,在您的问题中使用,在父级上创建一个child_attributes编写器。我感觉你正在尝试更新:孩子而不是:children_attributes。

这可以使用你所描述的模型,以及在before_update回调之后:

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