rails: 多对多关联-自定义关联表(has_many :through)

关联has_many :through通常用于与另一个模型建立多对多关系。此关联表示声明模型可以通过第三个模型与另一个模型的零个或多个实例匹配

例如,假设有一家医疗机构,患者可以预约看医生。相关关联声明可能如下所示:

01 生成模型

你需要创建三个模型:PhysicianAppointmentPatient。其中,Appointment 模型将包含两个外键:physician_idpatient_id

运行以下命令来生成这些模型:

rails g model Physician name:string
rails g model Patient name:string
rails g model Appointment physician:references patient:references

02 定义模型-多方

接下来,在模型文件中定义它们之间的关系。

app/models/physician.rb

class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end

app/models/patient.rb

class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end

03 定义模型-关联关系

app/models/appointment.rb

class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
end

04 使用举例

现在,你已经成功创建了 PhysicianPatientAppointment 模型,并定义了它们之间的关系。可以通过以下方式使用这些模型:

# 创建医生和病人
physician = Physician.create(name: "Dr. Smith")
patient = Patient.create(name: "John Doe")

# 创建预约
appointment = Appointment.create(physician: physician, patient: patient)

# 查找病人及其预约
physician.patients # => 包含所有与该医生有关的病人
patient.physicians # => 包含所有与该病人有关的医生

通过以上步骤,你可以在 Rails 应用中实现 PhysicianPatientAppointment 之间的多对多关系。这种结构在医疗管理系统中非常常见,可以有效管理医生、病人及其预约的信息。

rubyonrails rails