counter_cache 无效
counter_cache doesn't works
如果我在 rails 控制台(开发或单元测试环境)中执行:
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 在主题 class 中是 counter_cache,例如:
belongs_to :user, counter_cache: :topics_number
topics_number 在 table 个用户中。
如何在不重新加载的情况下强制更新?
我在 after_create
中有一个过程要做,我必须获得这个 cache_counter 的良好价值!
您无法在不重新加载的情况下更新 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
您可以使用 where(id: u.id).first
.
而不是 first
方法
如果我在 rails 控制台(开发或单元测试环境)中执行:
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 在主题 class 中是 counter_cache,例如:
belongs_to :user, counter_cache: :topics_number
topics_number 在 table 个用户中。
如何在不重新加载的情况下强制更新?
我在 after_create
中有一个过程要做,我必须获得这个 cache_counter 的良好价值!
您无法在不重新加载的情况下更新 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
您可以使用 where(id: u.id).first
.
first
方法