has_many :through within same model

has_many :through within same model

我的数据库中有用户模型。它有作用。角色可以是病人或医生。我想维护 doctor_patient table.

doctor_patient.rb

belongs_to :doctor,  class_name: 'User'
belongs_to :patient, class_name: 'User'

一个病人可以属于多个医生,一个医生可以有多个病人。通过关联,我更熟悉常规或正常 has_many,但面临与我在用户模型中扮演角色的场景相关的问题。

user.rb

user 
has_many :doctor_patients
has_many :patients, :through => :doctor_patients, :class_name=> "User"

patient 
has_many :doctor_patients
has_many :doctors, :through=> :doctor_patients, :class_name=> "User"

在 ActiveRecord 中,关联元数据(反射)作为散列存储在 class 属性中,名称用作键。因此,当您定义多个具有相同名称的关联时,您只是覆盖了之前的关联。

解决方案是为每个关联使用唯一的名称:

class User < ApplicationController
  has_many :doctor_patients_as_doctor, 
    foreign_key: :doctor_id,
    class_name: 'DoctorPatient'
  has_many :patients, 
    through: :doctor_patients_as_doctor

  has_many :doctor_patients_as_patient, 
    foreign_key: :patient_id,
    class_name: 'DoctorPatient'
  has_many :doctors, 
    through: :doctor_patients_as_patient
end

还要确保正确地将 table 复数化并将其命名为 doctor_patients.