Mongoid counter cache
class Forum
include Mongoid::Document
include Mongoid::Timestamps
field :posts_count, :type => Integer, :default => 0
has_many_related :posts
end
module Mongoid
module CounterCache
extend ActiveSupport::Concern
module ClassMethods
def counter_cache(options)
name = options[:name]
counter_field = options[:field]
after_create do |document|
relation = document.send(name)
relation.collection.update(relation._selector, {'$inc' => {counter_field.to_s => 1}}, {:multi => true})
end
after_destroy do |document|
relation = document.send(name)
relation.collection.update(relation._selector, {'$inc' => {counter_field.to_s => -1}}, {:multi => true})
end
end
end
end
end
class Post
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::CounterCache
counter_cache :name => 'forum', :field => 'posts_count'
belongs_to_related :forum
end