Skip to content

Instantly share code, notes, and snippets.

@ZhangHanDong
Created June 19, 2011 07:52
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save ZhangHanDong/1033906 to your computer and use it in GitHub Desktop.
Save ZhangHanDong/1033906 to your computer and use it in GitHub Desktop.
MongoId Counter Cahce
#
# lib/mongoid/counter_cache.rb
# ruby
#
# Created by Zhang Alex on 2011-06-17.
# Copyright 2011 __ZhangHanDong__. All rights reserved.
#
# ===================================
# class Forum
# references_many :topics
# references_many :posts
# end
#
#
# class Topic
# referenced_in :forum
# include Mongoid::CounterCache
# counter_cache name: :forum, inverse_of: :posts
# end
# ===================================
module Mongoid
module CounterCache
extend ActiveSupport::Concern
module ClassMethods
def counter_cache(metadata)
counter_name = "#{metadata[:inverse_of]}_count"
set_callback(:create, :after) do |document|
relation = document.send(metadata[:name])
if relation
relation.inc(counter_name.to_sym, 1) if relation.class.fields.keys.include?(counter_name)
end
end
set_callback(:destroy, :after) do |document|
relation = document.send(metadata[:name])
if relation && relation.class.fields.keys.include?(counter_name)
relation.inc(counter_name.to_sym, -1)
end
end
end
end #ClassMethods
end #CounterCache
end #Mongoid
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment