Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Polymorphic relationships and counter cache

So I have an app with a 2 different models, Comments and Replies, each of which you can either Agree or Disagree, so I have a polymorphic model called Emotion. Here is my code for these:

class Comment < ActiveRecord::Base
  belongs_to :user
  has_many :replies
  has_many :emotions, :as => :emotionable
end



class Reply < ActiveRecord::Base
  belongs_to :user
  belongs_to :comment
  has_many :emotions, :as => :emotionable
end

class Emotion < ActiveRecord::Base
  belongs_to :emotionable, :polymorphic => :true  
end

So this all works fine, but I'm going to need to add a counter cache for both Comment and Reply in order to get the size of the Agrees and Disagree for each Object. In all of the docs, it has examples for doing counter cache with normal polymorphic associations, not one with an extra condition in it. For reference, by schema for Emotion looks like this:

create_table "emotions", :force => true do |t|
  t.integer  "user_id"
  t.string   "emotion"
  t.integer  "emotionable_id"
  t.string   "emotionable_type"
  t.datetime "created_at",       :null => false
  t.datetime "updated_at",       :null => false
end

TL:DR - I need to be able to call @commet.agrees_count, @comment.disagrees_count, @reply.agrees_count and @reply.disagrees_count on a polymorphic association through a counter cache. So Comment and Reply will need 2 counter caches.

like image 776
Synthesezia Avatar asked Mar 21 '12 17:03

Synthesezia


1 Answers

you may want to add the counter cache attribute to the attr_readonly list in the associated classes (e.g. class Post; attr_readonly :comments_count; end). http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to

:polymorphic

    Specify this association is a polymorphic association by passing true. 
    Note: If you’ve enabled the counter cache, then you may
    want to add the counter cache attribute to the attr_readonly list in
    the associated classes 
    (e.g. class Post; attr_readonly :comments_count; end).
like image 172
why Avatar answered Oct 18 '22 11:10

why