У меня есть три связанных класса в Rails v. 3.2.15, с Ruby 2.1.1 и классом таблицы соединений между двумя из них:
class Grandarent < ActiveRecord::Base
has_many :parents, autosave: true
end
class Parent
belongs_to :grandparent
has_many :children, :through => :parent_children, autosave: true
end
class ParentChild
belongs_to :parent
belongs_to :child
end
class Child
has_many :parent_children
has_many :parents, :through => :parent_children
end
Если я выполню следующее, изменения в дочернем элементе не будут сохранены:
gp = Grandparent.find(1)
gp.parents.first.children.first.first_name = "Bob"
gp.save
gp.parents.first.children.first.first_name ## -> Whatever name was to begin with (i.e. NOT Bob)
Но если я заставлю Rails оценивать и возвращать данные из каждого соединения, то сохранение пройдет успешно.
gp = Grandparent.find(1)
gp.parents
gp.parents.first
gp.parents.first.children
gp.parents.first.children.first
gp.parents.first.children.first.first_name = "Bob"
gp.save
gp.parents.first.children.first.first_name ## -> "Bob"
Если я впоследствии снова выполню gp = Grandparent.find(1), то я сбросил все это и должен снова принудительно оценить ассоциации.
Это преднамеренное поведение или я что-то не так сделал? Нужно ли мне вешать автосохранение на подключения к таблице соединений, а также (или вместо) соединения has_many :through?
Из документации я вижу, что "загруженные" элементы будут сохранены. Это то, что необходимо для их загрузки? Может ли кто-нибудь точно определить, что такое «загружено» и как достичь этого состояния?