6

I am trying to get hold of rails counter cache feature but not able to grasp it completely.

Let's say that We have 3 models

A B C

A belongs to B or C depending upon a field key_type and key_id. key_type tells whether A belongs to B or C so if key_type="B" then the record belongs to B otherwise it belongs to C.

In my model a.rb, I have defined following associations:

belongs_to :b, :counter_cache => true, :foreign_key => "key_id"
belongs_to :c, :counter_cache => true, :foreign_key => "key_id"

and

in b and c model files

has_many :as , :conditions => {:key_type => "B"}
has_many :as , :conditions => {:key_type => "C"}

Both B and C Models have a column as as_count

The problem is every time an object of a is created count is increased in the both the models b and c.

Any help is appreciated. Initially i thought that this may work:

belongs_to :b, :counter_cache => true, :foreign_key => "key_id", :conditions => {:key_type => "B"}
belongs_to :c, :counter_cache => true, :foreign_key => "key_id", :conditions => {:key_type => "C"}

But this does not help.

Thanks

dombesz
  • 7,890
  • 5
  • 38
  • 47
Ishu
  • 628
  • 1
  • 13
  • 28

2 Answers2

15

It looks like polymorphic associations are the way to go for your issue.

Imagine you have a Comment model and 2 models which can be commented : Post and Profile.

In Post and Profile models :

has_many :comments, :as => :resource

In Comment model :

belongs_to :resource, :polymorphic => true, :counter_cache => true

Don't forget to add the "comments_count" column in both Profile and Post models and voilà !

kouak
  • 773
  • 6
  • 17
  • It's only working when adding comments. The comments_count increases but when a comment is deleted it won't update comments_count. any idea why this might be happening? any possible solution? Thank You. – Mr_Nizzle Oct 14 '14 at 16:38
  • looks like there's a bug with counter_cache and polymorphic relationships in rails < 5.0. See https://github.com/rails/rails/issues/16407 – John Jan 07 '16 at 16:25
4

See http://blog.locomotivellc.com/post/4120559953/counter-cache-polymorphism for a demo.

Martin Streicher
  • 1,983
  • 1
  • 18
  • 18