如果我在rails console(dev或单元测试ENV)中执行:
u = User.first
puts u.topics_number # 0
Topic.create!(user: u)
puts u.topics_number # 0
puts u.reload
puts u.topics_number # 1
其中topics_number是Topic类中的counter_cache,如:
belongs_to :user, counter_cache: :topics_number
topics_number在表用户中。
如何在不重新加载的情况下强制更新?
我在after_create
有一个过程,我必须得到这个cache_counter的好价值!
答案 0 :(得分:1)
如果没有重新加载,则无法更新u.topics_number
。这就是ActiveRecord在Rails中的工作方式。你在特定的时间拿东西并从中创建一个Ruby对象。在数据库中的那一刻之后发生的任何事情都不会被Ruby对象自动识别。你必须.reload
!
您可以做的是:
puts User.first.topics_number # 0
Topic.create!(user: User.first)
puts User.first.topics_number # 1
您可以使用first
代替where(id: u.id).first
方法。