Como processar novas crianças no retorno de chamada antes do After_Update para atributos de activerecord aninhados

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

Pergunta

Eu tenho um objeto modelo (digamos pai) com uma associação Has_Many em outro objeto modelo (filho).

class Parent < ActiveRecord::Base
    has_many :children
    accepts_nested_attributes_for :children
end

class Child < ActiveRecord::Base
    belongs_to :parent
end

No pai, quero adicionar código no retorno de chamada anterior ao Antes_Update para definir um atributo calculado com base em seus filhos.

O problema em que tenho encontrado é que, quando uso o método parent.update (id, atts), adicionando atts para novos filhos, aqueles adicionados à coleção ATTS não estão disponíveis durante antes_update (self.children retorna a antiga coleção) .

Existe alguma maneira de recuperar o novo sem mexer com os aceitos_nested_attributes_for?

Foi útil?

Solução

O que você descreve funciona para mim com o Rails 2.3.2. Eu acho que você pode não estar atribuindo adequadamente aos filhos dos pais. As crianças são atualizadas após a atualização?

aceita_nested_attributes_for, conforme usado em sua pergunta, cria um escritor infantil_attributes no pai. Tenho a sensação de que você está tentando atualizar: crianças em vez de: crianças_attributes.

Isso funciona usando seus modelos conforme descrito e este seguinte antes_update retorno de chamada:

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

Esses comandos no console:

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

Produza esta saída:

Jimmy
Julie
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top