在我的示例应用程序中,我有
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
数据库模型
在一周内,我的医生预约了20名患者,其中一名患者两次。对于doc = Physician.first
,如果我查看患者列表doc.patients
,我会得到患者列表,每个约会一个,包括一个列出两次的患者。我只想要一份独特的患者名单。我知道doc.patients.uniq
会给我一份独特的患者名单,但我不明白为什么这不是首先归还的。
我很感激任何解释为什么这样做的方式,以及我的模型实际上应该采用不同的结构。
答案 0 :(得分:2)
在您的模型中,您可以
has_many :patients, -> { uniq }, through: :appointments
uniq范围需要作为has_many的第二个参数传递。 (感谢coorasse更新了语法。)
您正在获得重复项,因为rails会通过约会获取所有患者协会,因此如果患者有多个约会,那么这是多个记录,并且rails将获取所有记录。添加:uniq告诉SQL获取唯一记录。