Как обработать новых дочерних элементов в обратном вызове before_update для вложенных атрибутов activerecord

StackOverflow https://stackoverflow.com/questions/2021059

Вопрос

У меня есть объект модели (скажем, родительский) с ассоциацией 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top