Как обработать новых потомков в обратном вызове before_update для вложенных атрибутов activerecord - PullRequest
4 голосов
/ 07 января 2010

У меня есть объект модели (скажем, Parent) с ассоциацией has_many на другом объекте модели (Child).

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 для новых потомков, те, которые добавляются в коллекцию atts, недоступны во время before_update (self.children возвращает Старая коллекция).

Есть ли способ получить новый, не связываясь с accepts_nested_attributes_for?

1 Ответ

3 голосов
/ 07 января 2010

То, что вы описываете, работает для меня с Rails 2.3.2. Я думаю, что вы, возможно, не назначаете детей родителям должным образом. Обновляются ли дети после обновления?

acceptpts_nested_attributes_for, как используется в вашем вопросе, создает писателя child_attributes на родительском элементе. У меня такое чувство, что вы пытаетесь обновить: children, а не: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...