gpt4 book ai didi

ruby-on-rails - has_many :through with counter_cache

转载 作者:数据小太阳 更新时间:2023-10-29 06:30:56 26 4
gpt4 key购买 nike

据我了解,在定义 :counter_cache 选项时,应在包含 belongs_to 声明的模型上指定它。所以我有点不确定在通过关联使用 has_may 时如何处理这个问题(因为我相信在这种情况下不使用 belongs_to 声明):

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

我希望使用 :counter_cache 选项来更有效地查找属于医生的患者数量。

myPhysician.patients.count

仅供引用:Rails 3.1

干杯

最佳答案

我不确定你想要什么样的关系。该示例类似于 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 有很多 Appointments,并且有很多 Patients
  • 一个约会属于(有一个)Physician和一个Patient
  • 一个 Patient 有许多 Appointments 和许多 Physicians

关于 :counter_cache 选项,根据 belongs_to doc :如果您想要属于 PhysicianPatients 的数量,您需要:

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

并且您需要编写迁移以将 patient_count 列添加到 Phyisicans 表。

然而,对于 has_many 通过关系 Rails 3.1 似乎自动检测 counter_cache 列,因此您不必指定它(删除 :counter_cache => :patient_count ).如果您指定它,您的计数器将增加 2(这很奇怪)。

顺便说一下,Rails 3.1 中的 :counter_cache 选项似乎存在一些问题,如这里所报告的:

考虑到所有这些,也许您最好的选择是使用回调编写您自己的计数机制。

希望对您有所帮助:)

关于ruby-on-rails - has_many :through with counter_cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com