#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, вероятно, будет иметь карту объектов .