Rails ActiveRecord 缓存问题

hmilym · 2014年11月25日 · 最后由 besfan 回复于 2014年11月27日 · 1841 次阅读

在 activerecord 世界中。

class A
  has_one :b
end

class B
  belongs_to :a
end

a =  A.find(xxxx)  # xxxx 是指A类的某一个id
p  a.b     #结果一
b = B.find(a.b.id) 
b.update_attributes(:something_key => :something_value)
p a.b   #结果二

两个结果一样,预期应该不一样才对,why? how? a.reload ?

1 楼 已删除

你的例子可以简化成这样:

b1 = B.find xxx
p b1 #结果一
b2 = B.find xxx
b2.update_attributes k: :v
p b2 #结果二

b1 和 b2 两个对象虽然都对应同一个数据库记录,却是不同时间点上的记录

是需要 reload 的吧。数据库更新不可能反馈到对象上的。

这个是因为 activeRecord 的机制问题

如果不做设置,修改这种 association 里的值是不会同步更新的

需要你去 reload

如果你写 rspec,会经常遇见这种问题

Active Record 提供了 :inverse_of 选项,可以告知 Rails 两者之间的关系:

class Customer < ActiveRecord::Base
  has_many :orders, inverse_of: :customer
end

class Order < ActiveRecord::Base
  belongs_to :customer, inverse_of: :orders
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号