counter_cache with has_many :through

前端 未结 3 1197
温柔的废话
温柔的废话 2020-11-30 04:59

I just created a counter_cache field and the controller looks like this.

 @users = User.where(:sex => 2).order(\'received_likes_count\')
<
相关标签:
3条回答
  • 2020-11-30 05:22

    According to this post (from last month) and this post (from 2008), it doesn't seem to be possible. However, the latter post does have code for a workaround (copy/paste'd from that link for your convenience, credit goes to DEfusion in the second 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.B.A.id )
        end
    
        def decrement_A_counter_cache
            A.decrement_counter( 'c_count', self.B.A.id )
        end
    end
    

    (This is for a scheme where C belongs_to B, B belongs_to A, A has_many C :through => B

    0 讨论(0)
  • 2020-11-30 05:29

    You have previous

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

    and migration

        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
    

    now change all to

        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
    

    and new one

        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
    
    0 讨论(0)
  • 2020-11-30 05:29

    This basically does the same thing:

    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
    

    And you need a posts_count column on tags, or whatever associations you have.

    0 讨论(0)
提交回复
热议问题