Ruby on Rails自动保存关联

时间:2014-08-12 20:12:56

标签: ruby-on-rails ruby activerecord model autosave

我在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;是,以及如何实现这种状态?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为gp.parentsparents缓存到结果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")