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 to handle this when working with a has_may through association (as I believe that a belongs_to declaration is not used in this scenario):
class Physician < ActiveRecord::Base has_many :appointments has_many :patients, :through => :appointments end class Appointment < ActiveRecord::Base belongs_to :physician, :counter_cache => appointment_count end class Patient < ActiveRecord::Base end
I wish to use the :counter_cache option to make finding the number of Patients belonging to a Physician more efficient.
myPhysician.patients.count
FYI: Rails 3.1
Cheers
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
Physician
has many Appointments
, and has many Patients
Appoinment
belongs to (has one) Physician
and one Patient
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:
With all of that in mind, maybe your best bet is to write your own count mechanism using callbacks.
Hope it helps :)
I added a counter_cache
to a has_many :through
association on Rails 5.1, and the philosophy is the same as with has_many
. Using the Physician, Appointment, Patient example:
patients_count
to the physicians
table as an integerbelongs_to :physician, counter_cache: :patients_count
Note: the answer above is correct, this answer just confirms that it works on Rails 5.1.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With