rails: 多对多关联-自定义关联表(has_many :through)
关联has_many :through
通常用于与另一个模型建立多对多关系。此关联表示声明模型可以通过第三个模型与另一个模型的零个或多个实例匹配。
例如,假设有一家医疗机构,患者可以预约看医生。相关关联声明可能如下所示:
01 生成模型
你需要创建三个模型:Physician
、Appointment
和 Patient
。其中,Appointment
模型将包含两个外键:physician_id
和 patient_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 使用举例
现在,你已经成功创建了 Physician
、Patient
和 Appointment
模型,并定义了它们之间的关系。可以通过以下方式使用这些模型:
# 创建医生和病人
physician = Physician.create(name: "Dr. Smith")
patient = Patient.create(name: "John Doe")
# 创建预约
appointment = Appointment.create(physician: physician, patient: patient)
# 查找病人及其预约
physician.patients # => 包含所有与该医生有关的病人
patient.physicians # => 包含所有与该病人有关的医生
通过以上步骤,你可以在 Rails 应用中实现 Physician
、Patient
和 Appointment
之间的多对多关系。这种结构在医疗管理系统中非常常见,可以有效管理医生、病人及其预约的信息。