计数缓存(counter_cache)能够在has_many关联中使用吗?

5

我正在为我的模型添加 counter_cache:

用户 (id, org_id) 组织 (id, users_count)

但是出现了以下错误:ArgumentError (未知的键:counter_cache):

class Org < ActiveRecord::Base
   has_many :users, :counter_cache => true

class User < ActiveRecord::Base
   belongs_to :org

有什么想法是设置错误的吗?我希望Org.users_count返回计数器缓存,以获取该组织中用户数量的#?
1个回答

15

这样是行不通的。你必须将counter_cache移到belongs_to关联中:

class User < ActiveRecord::Base
   belongs_to :org, :counter_cache => true
end

Org模型中添加一个users_count字段,然后Rails会自动更新该字段。在迁移中不要忘记添加:default=>0,否则它可能无法正常工作。

如果你的应用程序中已经有一些数据,并且想要同步计数器,那么你可以在迁移后运行类似以下代码的东西:

  Org.find(:all).each do |o|
    Org.update_counters o.id, :users_count => o.users.count
  end

谢谢,那似乎有所帮助。触发现有记录重置的最佳方法是什么?考虑到已经运行了迁移,我可以将其作为Rake任务运行吗? - AnApprentice
1
我已经编辑了问题。你可以使用 rails runner 运行那段代码。 - lucapette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接