我最近开始在 Rails 中使用计数器缓存。然而这个上手起来要比指南里写的难一点。
指南里这样写的:
缓存关联对象的数量。例如,posts 表中的 comments_count 字段,缓存每篇文章的评论数;
英文版:
Used to cache the number of belonging objects on associations. For example, a comments_count column in a Post class that has many instances of Comment will cache the number of existent comments for each post.
虽然 Rails 内置机制做了困难的这部分,但你仍然需要做一些步骤否则它无法工作。以下是你要让计数器缓存工作需要做的一些事情。
我们使用和指南里一样的示例:我们想要计算一篇博客文章里的评论数量。
model 的定义像这样:
class Post < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :post
end
你需要做的第一件事是加一个 comments_count column 到 Post model 里。你可以用 migration 来做这个。运行了 migration 之后你还需要告诉 rails,这个 column 应该被用来当做计数缓存:
belongs_to :post, :counter_cache => true
剩下的问题是,如果之前数据库里已经有了 posts 和 comments 那么这个计数器是关闭的。这是因为当你创建或删除 model 的一个实例时计数器缓存增加或减少了。你可以像这样给 posts 重置计数器:
Post.find_each { |post| Post.reset_counters(post.id, :comments) }
可以把这个写成 rake task,那样当你的缓存计数出问题时你就可以运行它。
原文分享出来,欢迎大家交流指正。