solotimes
7/14/2011 - 11:49 AM

Mongoid counter cache

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