0

Je suis sûr que c'est un comportement ordinaire de Rails, et il me manque quelque chose de fondamental, mais qu'est-ce que c'est?Rails: L'enfant ne suit pas les changements dans le parent

Un enfant appartient à un parent, un parent a plusieurs membres.

parent = Parent.create(:name=>"Kerkhoff, J") 
child = parent.children.create(:first_name => "Sally") 
puts child.parent.name # ==> Kerkhoff, J 
parent.update_attributes(:name=>'Zorro, A') 
puts parent.name   # ==> 'Zorro, A' 
puts child.parent.name # ==> 'Kerkhoff, J' 
child.save  # ==> true (Does saving the child refresh its parent.name?) 
puts child.parent.name # ==> 'Kerkhoff, J' (No) 
child = Child.find(child.id)  # reload child from database 
puts child.parent.name # ==> 'Zorro, A' (This does refresh the name) 

Bien que l'attribut name de parent a été changé, et bien que child continue de se référer au même parent, il ne reflète pas l'attribut mis à jour du parent. Il ne s'agit pas non plus de l'échec de update_attributes. Si l'enregistrement de Sally (child) est à nouveau extrait de la base de données, l'attribut name reflète la nouvelle valeur de parent.

Que se passe-t-il ici?

Merci pour votre perspicacité!

Répondre

1

Ceci est dû à l'absence d'une mappe d'objets dans ActiveRecord. L'enregistrement de l'objet enfant sans modifier le parent n'actualisera pas le parent.

Pour actualiser l'association, faites quelque chose comme child.parent(true).name.

+0

Scoop intérieur: Rails 3.1 aura probablement une [carte d'objet] (https://github.com/rails/rails/pull/76). – iain

+0

Merci pour l'info. –