0

Ich bin sicher, das ist gewöhnliche Rails Verhalten, und ich vermisse etwas Grundlegendes, aber was ist das?Schienen: Child Record nicht verfolgen Änderungen in Parent

Ein Kind gehört einem Elternteil, ein Elternteil hat viele Mitglieder.

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) 

Obwohl das name Attribut parent geändert wurde, und obwohl child auf den gleichen Eltern beziehen weiterhin, ist es nicht der Eltern aktualisiert Attribut widerspiegeln. Es ist auch keine Frage von update_attributes. Wenn Sallys Datensatz (child) erneut aus der Datenbank abgerufen wird, gibt das name-Attribut den neuen Wert parent wieder.

Was geht hier vor?

Vielen Dank für Ihre Einsicht!

Antwort

1

Dies liegt an einer fehlenden Objektzuordnung in ActiveRecord. Wenn das untergeordnete Objekt gespeichert wird, ohne das übergeordnete Element zu ändern, wird das übergeordnete Element nicht aktualisiert.

Um die Zuordnung zu aktualisieren, tun Sie etwas wie child.parent(true).name.

+0

Inside Scoop: Rails 3.1 wird wahrscheinlich eine [Objektkarte] (https://github.com/rails/rails/pull/76) haben. – iain

+0

Danke für die Info. –