Только одна строка, представляющая несколько моделей в Rails - PullRequest
0 голосов
/ 08 мая 2018

Возможно ли в рельсах иметь только одну таблицу с одной строкой, представляющей несколько моделей? Например:

Пользователь 1 - Доктор

Пользователь 2 - Доктор и Учитель

 user_id | doctor_id | type_doctor | teacher_id | type_teacher |  
   1         1           true          NULL          NULL
   2         2           true           1            true   

При этом только в одном ряду я могу узнать, кто мой пользователь.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Конечно, вы могли бы сделать это таким образом, но это не имеет особого смысла. Если вы хотите это сделать, у вас может быть что-то вроде:

# == Schema Information
#
# Table name: role_records
#
#  id           :integer          not null, primary key
#  user_id      :integer
#  doctor_id    :integer
#  teacher_id   :integer
#  created_at   :datetime         not null
#  updated_at   :datetime         not null
#
class RoleRecord < ApplicationRecord
  belongs_to :user
  [:doctor, :teacher].each do |role|
    belongs_to role
    define_method("#{role}?") do 
      !send(role).nil?
    end
  end
end

class User < ApplicationRecord
  has_one :role_record
end

class Doctor < ApplicationRecord
  has_one :role_record
end

class Teacher < ApplicationRecord
  has_one :role_record
end

В этом случае вы можете сделать что-то вроде:

@user.role_record.doctor?
@user.role_record.teacher?

Это, конечно, barf, если role_record равно nil. Итак, вы можете сделать что-то вроде:

@user.role_record.try(:doctor?)

Естественно, это все ужасно. Помимо ужасного хака, ваша таблица RoleRecord может оказаться малонаселенной.

Почему вы решили отказаться от направления из вашего вопроса вчера?

Что вы действительно пытаетесь сделать?

0 голосов
/ 08 мая 2018

Если вы хотите проверить, является ли конкретный пользователь врачом или инженером, вы можете добиться этого, создав отношения has_many through.

Итак, модель Profession будет содержать все профессии, такие как врач, учитель, инженер и т. Д. Убедитесь, что их идентификаторы не меняются

В модели UserProfessionMapping мы можем создавать области для фильтрации записей, относящихся к конкретным профессиям

В модели User эти роли будут определять, является ли пользователь врачом или учителем.

class User < ApplicationRecord
  # id
  # email
  # ..

  has_many :user_profession_mappings
  has_many :professions, through: :user_profession_mappings

  def is_doctor?
    self.user_profession_mappings.doctor.present?
  end

  def is_teacher?
    self.user_profession_mappings.teacher.present?
  end
end


class Profession < ApplicationRecord
  # Only two columns - >
  # id
  # name
  has_many :user_profession_mappings
  has_many :users, through: :user_profession_mappings

  # Doctor - id: 1
  # Teacher - id: 2
  # Engineer - id: 3

end


class UserProfessionMapping < ApplicationRecord
  # only 2 columns ->
  # user_id
  # profession_id

  belongs_to :user
  belongs_to :profession

  scope :doctor, -> {where profession_id: 1}
  scope :teacher, -> {where profession_id: 2}
  scope :engineer, -> {where profession_id: 3}
end

Чтобы добавить пользователя в профессию, вам нужно что-то вроде этого ->

doctor = Profession.find(1) # since id for doctor is 1
@user.professions << doctor

Теперь, чтобы проверить, является ли пользователь врачом, вы должны сделать

@user.is_doctor? # will give true
@user.is_teacher? # will give false

Для получения дополнительной информации ознакомьтесь с официальной документацией

0 голосов
/ 08 мая 2018

У вас должно быть 3 модели. User, Doctor и Teacher и не хранить информацию в одном месте.

class User
  has_one :doctor
  has_one :teacher
end

class Doctor
  belongs_to :user
end

class Teacher
  belongs_to :user
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...