counter_cache con has_many: through

Ho appena creato un campo counter_cache e il controller è simile a questo.

@users = User.where(:sex => 2).order('received_likes_count') 

L’associazione in User.rb è

  has_many :received_likes, :through => :attachments, :source => :likes, :dependent => :destroy 

Il problema è che counter_cache è dichiarato nel appartenere a Like.rb e non so come dirlo per l’has_many: attraverso l’associazione.

  belongs_to :user, :counter_cache => :received_likes 

Hai precedenti

  class Product has_and_belongs_to_many :categories end class Category has_and_belongs_to_many :products end 

e migrazione

  class CreateCategoriesProducts < ActiveRecord::Migration def change create_table :categories_products, id: false do |t| t.references :category t.references :product end add_index :categories_products, [:category_id, :product_id] end end 

ora cambia tutto in

  class Product has_many :categories_products, dependent: :destroy has_many :categories, through: :categories_products end class Category has_many :categories_products, dependent: :destroy has_many :products, through: :categories_products end 

e nuovo

  class CategoriesProduct < ActiveRecord::Base # this model uses table "categories_products" as it is # column products_count is in the table "categories" belongs_to :category, counter_cache: :products_count belongs_to :product end 

Secondo questo post (dal mese scorso) e questo post (dal 2008), non sembra ansible. Tuttavia, quest’ultimo post ha il codice per una soluzione alternativa (copia / incolla da quel link per comodità, il credito va a DEfusion nel secondo link)

 class C < ActiveRecord::Base belongs_to :B after_create :increment_A_counter_cache after_destroy :decrement_A_counter_cache private def increment_A_counter_cache A.increment_counter( 'c_count', self.BAid ) end def decrement_A_counter_cache A.decrement_counter( 'c_count', self.BAid ) end end 

(Questo è per uno schema in cui C appartiene_ a B, B appartiene_ a A, A has_many C: through => B

Questo fondamentalmente fa la stessa cosa:

 after_save :cache_post_count_on_tags def cache_post_count_on_tags tags.each {|t| tag.update_attribute(:posts_count, t.posts.size)} end 

E hai bisogno di una colonna posts_count sui tag o qualsiasi altra associazione tu abbia.