Comment traiter les nouveaux enfants en rappel before_update pour les attributs imbriqués activerecord

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

Question

J'ai un modèle d'objet (disons Parent) avec une association has_many sur un autre modèle d'objet (enfant).

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

class Child < ActiveRecord::Base
    belongs_to :parent
end

Le parent, je veux ajouter du code sur le rappel de before_update pour définir un attribut calculé en fonction de ses enfants.

Le problème que j'ai couru en est que lorsque j'utilise la méthode Parent.update (id, atts), en ajoutant de nouveaux atts pour les enfants, ceux qui sont ajoutés dans la collection atts ne sont pas disponibles pendant before_update (self.children retourne la ancienne collection).

Est-il possible de récupérer le nouveau sans déconner avec le accepts_nested_attributes_for?

Était-ce utile?

La solution

Ce que vous décrivez fonctionne pour moi avec Rails 2.3.2. Je pense que vous ne pouvez pas être assignez aux enfants d'un parent correctement. Les enfants sont-mis à jour après la mise à jour?

accepts_nested_attributes_for, tel qu'il est utilisé dans votre question, crée un écrivain child_attributes sur le parent. J'ai le sentiment que vous essayez de mettre à jour: les enfants par opposition à: children_attributes.

Cela fonctionne en utilisant vos modèles comme décrit et ce rappel before_update suivant:

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

ces commandes dans la console:

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

produire cette sortie:

Jimmy
Julie
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top