我在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连接上挂起自动保存?
从文档中,我看到&#34;已加载&#34;会员将被保存。这是加载它们所必需的吗?有人可以准确定义&#34;加载&#34;是,以及如何实现这种状态?
答案 0 :(得分:1)
这种情况正在发生,因为gp.parents
将parents
缓存到结果Array
中,然后parents.first
实际上正在调用Array.first
。但是,gp.parents.first
每次都会使用LIMIT 1
执行查询,因此每次都会返回一个新对象。
您可以这样确认:
gp.parents.first.object_id # performs new query (LIMIT 1)
=> 1
gp.parents.first.object_id # performs new query (LIMIT 1)
=> 2
gp.parents # performs and caches query for parents
gp.parents.first.object_id # returns first result from parents array
=> 1
gp.parents.first.object_id # returns first result from parents array
=> 1
您可以使用您的查询链接更新,如下所示:
gp.parents.first.children.first.update_attributes(first_name: "Bob")