Skip to content

jah2488/mongoid-magic-counter-cache

Repository files navigation

Mongoid Magic Counter Cache Build Status Code Climate

DESCRIPTION

Mongoid Counter Cache is a simple mongoid extension to add basic counter cache functionality to Embedded and Referenced Mongoid Documents.

RDOC

http://rdoc.info/github/jah2488/mongoid-magic-counter-cache/master/frames

INSTALLATION

Mongoid Magic Counter Cache requires ruby 1.9.3 at a minimum

RubyGems

$ [sudo] gem install mongoid_magic_counter_cache

GemFile

gem 'mongoid_magic_counter_cache'

USAGE

First add a field to the document where you will be accessing the counter cache from.

class Library
  include Mongoid::Document

  field :name
  field :city
  field :book_count
  has_many :books

end

Then in the referrenced/Embedded document. Include Mongoid::MagicCounterCache

class Book
  include Mongoid::Document
  include Mongoid::MagicCounterCache

  field :first
  field :last

  belongs_to    :library
  counter_cache :library
end
$ @library.book_count
#=> 990

Alternative Syntax

If you do not wish to use the model_count naming convention, you can override the defaults by specifying the :field parameter.

counter_cache :library, :field => "total_amount_of_books"

Conditional Counter

If you want to maintain counter based on certain condition, then you can specify it using :if

class Post 
  include Mongoid::Document

  field :article
  field :comment_count

  has_many :comments

end

Then in the referrenced/Embedded document, add condition for counter using :if

class Comment
  include Mongoid::Document
  include Mongoid::MagicCounterCache

  belongs_to :post

  field :remark
  field :is_published, type: Boolean, default: false

  counter_cache :post, :if => Proc.new { |act| (act.is_published)  }
end

comment_count will get incremented / decremented only when :if condition returns true

Conditional Counter After Update

In conjunction with the conditional counter, if you want to maintain counter after an update to an object, then you can specify it using :if_update

Using same example as above, in the referrenced/Embedded document, add an additional condition for counter using :if_update

class Comment
  include Mongoid::Document
  include Mongoid::MagicCounterCache

  belongs_to :post

  field :remark
  field :is_published, type: Boolean, default: false

  counter_cache :post, :if => Proc.new { |act| (act.is_published)  }, :if_update => Proc.new { |act| act.changes['is_published'] }
end

When a comment is saved, comment_count will get incremented / decremented if the is_published field is dirty.

CONTRIBUTE

If you'd like to contribute, feel free to fork and merge until your heart is content