Назначить пользовательскую модель одной из двух моделей? - PullRequest
1 голос
/ 29 апреля 2019

У меня есть пользовательская модель, которую я хочу назначить учителем или учеником (учитель и ученик - две раздельные модели), потому что, если пользователь зарегистрируется, у него будут разные поля регистрации в зависимости от того, является ли он учителем или учеником. Пользователь может быть учителем или учеником, но не обоими.

Я пытался, но не думаю, что это лучший способ сделать это. Любая помощь?

class User < AR
  has_secure_password

  has_one :teacher, class_name: "teacher", foreign_key: "teacher_id", conditions: { role: 'teacher' }
  has_one :student, class_name: "student", foreign_key: "student_id", conditions: { role: 'student' }

  enum role: [:teacher, :student]
end

class Teacher < AR
  belongs_to :user, class_name: "user", foreign_key: "user_id"
end

class Student < AR
  belongs_to :user, class_name: "user", foreign_key: "user_id"
end

1 Ответ

1 голос
/ 29 апреля 2019

Вот как вы можете реализовать ИППП для вашего случая

class User < AR
  has_secure_password

  # Make all forms with User data send params with ':user' as a param key
  # instead of ':user_teacher'/':user_student'
  def self.model_name
    ActiveModel::Name.new(self, nil, 'User')
  end
end

class Teacher < User
  # custom methods 
end

class Student < User
  # custom methods
end

Таким образом, вы можете иметь свою форму с form_for @user do # ....

Одно предостережение, все это помещается в таблицу Single в БД (отсюда и название Single Table Inheritance), и это означает много значений NULL для несвязанных полей (скажем, Teacher имеет teacher_identification_number, и у пользователя есть student_identification_number, которые различаются по размеру или требуют другой проверки) для всех учеников, у которых атрибут teacher_identification_number будет равен NULL, и наоборот.

Если поля сильно различаются между двумя моделями, вы можете проанализировать свои данные и поместить их в другую таблицу, к которой будет иметь доступ только учитель / ученик, которая называется нормализацией базы данных (скажем, Teacher has_many ClassInfo или has_one JobInfo или Teacher has_one TeacherProfile и Student has_one StudentProfile или что-либо еще.

Все зависит от того, как вы смоделируете вашу БД.

Ссылки:
- Сообщение в блоге - Среднее - STI
- Видеолинк - Дрифтинг Рубин - STI
- Ссылка на видео - @ RailsCasts - STI
- Сообщение в блоге - StudyTonight - Нормализация БД

...