gpt4 book ai didi

ruby-on-rails - rails + postgres : Using Group query on a has_many through

转载 作者:行者123 更新时间:2023-11-29 14:18:58 24 4
gpt4 key购买 nike

我正在努力理解 group 在 Rails 中的工作方式。似乎也没有任何好的教程......

class Doctor
has_many :appointments
has_many :patients, through: :appointments
end

class Appointment
has_many :doctors
has_many :patients
end

class Patient
has_many :appointments
has_many :doctors, through: :appointments
end

Doctor 类有一个字段primary_doctor。一个patient可以有很多医生,但是只有一个primary_doctor

给定一个特定的医生,我想要一个医生看到的所有患者的列表,按每个患者的primary_doctor分组

doctor.patients.joins(:appointments).where(appointments: { is_primary: true }).group("patients.id, appointments.doctor_id")

是我认为应该起作用的方法,但这不会进行任何分组。如果我在末尾添加一个 .count,它几乎可以满足我的要求,但我得到的不是实际对象,而是 {doctor_id=>patient_count} 的散列.

想法?谢谢!

最佳答案

如果我正确理解您的问题,您需要使用 Ruby 的内存中 group_by 函数。除非我错过了过去 10 年的一些东西,否则 ActiveRecord 无法将数据库查询直接编码为您正在寻找的表示类型。

因此,要获取医生看过的所有患者的列表,并按每个患者的 primary_doctor 分组,您可以执行以下操作:

doctor.patients.joins(:appointments).where(appointments: { is_primary: true }).
group_by(&:primary_doctor)

这会给你这样的结果:

{
<Doctor id: 1, name: "Dr Bob"> =>
[<Patient id: 1, name: "Joe">,
<Patient id: 2, name: "Jane">],
<Doctor id: 2, name: "Dr Spock"> =>
[<Patient id: 3, name: "Jack">,
<Patient id: 4, name: "Jill">,
<Patient id: 5, name: "Scotty">]
}

请注意,如果您每次都必须返回数据库以获取 primary_doctor,这可能会有点低效,因此如果这是您应用程序中的关键路径,您可能还会使用 includes ( http://apidock.com/rails/ActiveRecord/QueryMethods/includes ) 在某处。

关于ruby-on-rails - rails + postgres : Using Group query on a has_many through,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36917891/

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