has_many :through with counter_cache

后端 未结 4 985
悲&欢浪女
悲&欢浪女 2020-12-06 09:40

It is my understanding that when defining a :counter_cache option it is to be specified on the model that includes the belongs_to declaration. So I am a little unsure of how

4条回答
  •  情话喂你
    2020-12-06 10:02

    I'm not sure what kind of relationship you want. That example is similar to the one in the Rails Guide

    class Physician < ActiveRecord::Base
      has_many :appointments
      has_many :patients, :through => :appointments
    end
    
    class Appointment < ActiveRecord::Base
      belongs_to :physician
      belongs_to :patient
    end
    
    class Patient < ActiveRecord::Base
      has_many :appointments
      has_many :physicians, :through => :appointments
    end
    
    • A Physician has many Appointments, and has many Patients
    • An Appoinment belongs to (has one) Physician and one Patient
    • a Patient has many Appointments and many Physicians.

    Regarding the :counter_cache option, according to the belongs_to doc: If you want the number of Patients belonging to a Physician you would need:

    class Appointment < ActiveRecord::Base
      belongs_to :physician, :counter_cache => :patient_count
      belongs_to :patient
    end
    

    And you need to write a migration to add the patient_count column to the Phyisicans table.

    However, for has_many through relationships Rails 3.1 seems to automatically detect the counter_cache column, so you don't have to specify it (remove :counter_cache => :patient_count). If you do specify it your counter will go up by two (this is very weird).

    By the way, there seems to be some problems with :counter_cache option in Rails 3.1, as reported here:

    • https://github.com/rails/rails/issues/3903
    • https://github.com/rails/rails/issues/3085

    With all of that in mind, maybe your best bet is to write your own count mechanism using callbacks.

    Hope it helps :)

提交回复
热议问题