Как обработать новых дочерних элементов в обратном вызове before_update для вложенных атрибутов activerecord
-
19-09-2019 - |
Вопрос
У меня есть объект модели (скажем, родительский) с ассоциацией 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 для новых дочерних элементов, добавленные в коллекцию atts недоступны во время before_update (self.children возвращает старую коллекцию).
Есть ли какой-нибудь способ получить новый, не вмешиваясь в accepts_nested_attributes_for?
Решение
То, что вы описываете, работает для меня с Rails 2.3.2.Я думаю, что вы, возможно, неправильно распределяете детей одного из родителей.Обновляются ли дочерние элементы после обновления?
accepts_nested_attributes_for, как используется в вашем вопросе, создает child_attributes writer для родительского элемента.У меня такое чувство, что вы пытаетесь обновить :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