복붙노트

[RUBY-ON-RAILS] has_many와 counter_cache : 통해

RUBY-ON-RAILS

has_many와 counter_cache : 통해

난 그냥 counter_cache 필드와 같은 컨트롤러 모양을 만들었습니다.

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

User.rb의 연관은

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

협회를 통해 : 문제 counter_cache이 Like.rb의 belong_to에 선언하고, 내가 has_many입니다 그것이 얘기하는 방법을 모른다는 것이다.

  belongs_to :user, :counter_cache => :received_likes

해결법

  1. ==============================

    1.당신은 이전이

    당신은 이전이

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

    및 마이그레이션

        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
    

    이제 모든 변경

        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
    

    새로운 하나

        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
    
  2. ==============================

    2.(지난 달)이 게시물 및 (2008)이 게시물에 따르면, 가능하지 않는 것 같습니다. 그러나 후자의 게시물 해결 방법에 대한 코드를 가지고 (복사 / 사용자의 편의를 위해 해당 링크에서 paste'd, 신용은 두 번째 링크 DEfusion로 이동)

    (지난 달)이 게시물 및 (2008)이 게시물에 따르면, 가능하지 않는 것 같습니다. 그러나 후자의 게시물 해결 방법에 대한 코드를 가지고 (복사 / 사용자의 편의를 위해 해당 링크에서 paste'd, 신용은 두 번째 링크 DEfusion로 이동)

    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
    

    관통 => B (이는 방식 C가 B, A belongs_to B, A의 C has_many belongs_to위한

  3. ==============================

    3.이것은 기본적으로 같은 일을 :

    이것은 기본적으로 같은 일을 :

    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
    

    그리고 당신은 당신이 가지고 POSTS_COUNT 태그에 대한 열, 또는 무엇이든 연결을해야합니다.

  4. from https://stackoverflow.com/questions/5256897/counter-cache-with-has-many-through by cc-by-sa and MIT license