Rails: дочерняя запись не отслеживает изменения в родительском

#ruby-on-rails #activerecord #associations #model-associations

#ruby-on-rails #activerecord #ассоциации #модель-ассоциации

Вопрос:

Я уверен, что это обычное поведение Rails, и я упускаю что-то фундаментальное, но что это?

Дочерний элемент принадлежит родительскому элементу, у родительского элемента много членов.

 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)
  

Хотя name атрибут parent был изменен и child продолжает ссылаться на того же родителя, он не отражает обновленный атрибут родителя. Также дело не в update_attributes сбое. Если запись Салли ( child ) снова извлекается из базы данных, name атрибут отражает parent новое значение.

Что здесь происходит?

Спасибо за ваше понимание!

Ответ №1:

Это связано с отсутствием карты объектов в ActiveRecord. Сохранение дочернего объекта без изменения родительского объекта не приведет к обновлению родительского объекта.

Чтобы обновить ассоциацию, сделайте что-то вроде child.parent(true).name .

Комментарии:

1. Внутри scoop: Rails 3.1, вероятно, будет иметь карту объектов .