Что лучше всего подходит для нескольких типов пользователей в Ruby на Rails - PullRequest
1 голос
/ 18 марта 2020

Я создаю приложение, которое имеет несколько типов пользователей. Подумайте: пациент и доктор.

У пациента много врачей, а у доктора много пациентов.

Изначально я собирался поместить их всех под одного пользователя и, возможно, добавить столбец ролей, или рассматривал полиморфные ссылки c (с которыми я пока не очень знаком).

Лучше ли делать вышеперечисленное или лучше просто иметь их как разные классы. Проблема, которую я пытаюсь решить, начинается с входа в систему, а затем отношений классов с таблицей соединений. Например, как пользователь может иметь много пользователей через встречи? Это возможно?

Какая лучшая практика для того, что я собираюсь здесь?

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Здесь вы можете наследовать одну таблицу.

class User
end

class Patient < User
end

class Doctor < User
end

В таблице пользователей у вас будет столбец типа, который будет определять тип пользователя.

ссылка - https://medium.com/@dcordz / одиночная таблица-наследование-использование -rails-5-02-6738bdd5101a

1 голос
/ 18 марта 2020

Если у пациентов много врачей, а у врачей много пациентов, то у вас есть отношения многие ко многим. Отношение «многие ко многим» требует таблицы связывания.

Давайте назовем это отношением «обработки» (потому что у меня нет хорошего имени, оно должно быть существительным), как лечит врач пациент. Ваша миграция будет

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...