Como processar novas crianças no retorno de chamada antes do After_Update para atributos de activerecord aninhados
-
19-09-2019 - |
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?
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