Если у пациентов много врачей, а у врачей много пациентов, то у вас есть отношения многие ко многим. Отношение «многие ко многим» требует таблицы связывания.
Давайте назовем это отношением «обработки» (потому что у меня нет хорошего имени, оно должно быть существительным), как лечит врач пациент. Ваша миграция будет
create_table :treatments do |table|
table.timestamps
table.integer :doctor_id
table.integer :patient_id
end
Тогда ваши ассоциации должны будут указать, что эти идентификаторы go для таблицы users
.
class Treatment < ApplicationRecord
belongs_to :doctor, class_name: 'User'
belongs_to :patient, class_name: 'User'
end
class User < ApplicationRecord
has_many :as_patient_treatments, class_name: 'Treatment', foreign_key: patient_id
has_many :doctors, through: :as_patient_treatments
has_many :as_doctor_treatments, class_name: 'Treatment', foreign_key: doctor_id
has_many :patients, through: :as_doctor_treatments
end
Возможно, вы захотите разбить это, используя ИППП, если у вас больше поведения, которое отличается между врачом и пациентом.
class User < ApplicationRecord
end
class Patient < User
has_many :as_patient_treatments, class_name: 'Treatment', foreign_key: patient_id
has_many :doctors, through: :as_patient_treatments
end
class Doctor < User
has_many :as_doctor_treatments, class_name: 'Treatment', foreign_key: doctor_id
has_many :patients, through: :as_doctor_treatments
end
Другой, совершенно законный подход, особенно если у вас есть дополнительные данные для пациентов и врачей, - это иметь doctors
, a patients
и таблица users
вместо STI. Вам по-прежнему нужна таблица treatments
, чтобы связать врачей и пациентов.
Значение User
- это учетная запись, в которую можно войти. Врач и пациент могут иметь user_id
для своей учетной записи.
create_table :users do |table|
table.timestamps
table.string :username
table.string :email
...
end
create_table :doctors do |table|
table.timestamps
table.bigint :user_id
table.specialty
...
end
create_table :doctors do |table|
table.timestamps
table.bigint :user_id
table.payer
...
end
create_table :treatments do |table|
table.timestamps
table.bigint :doctor_id
table.bigint :patient_id
end
class User
has_one :doctor
has_one :patient
...
end
class Treatment
belongs_to :doctor
belongs_to :patient
end
class Doctor
belongs_to :user
has_many :treatments
has_many :patients, through: :treatments
delegate :username, :email, :to => :user
...
end
class Patient
belongs_to :user
has_many :treatments
has_many :doctors, through: :treatments
delegate :username, :email, :to => :user
...
end