#ruby-on-rails #design-patterns #inheritance #single-table-inheritance
#ruby-on-rails #шаблоны проектирования #наследование #наследование одной таблицы
Вопрос:
Я создаю небольшое приложение, в котором есть классы User, Student, Tutor, Meeting.
Каждый пользователь может быть преподавателем на одном собрании, но студентом на другом собрании. Я думал о том, как смоделировать эти отношения.
Прямо сейчас у меня есть модель пользователя, отдельная модель участника с атрибутом Role = «tutor» / «student». Преподаватель и студент расширяют участников, используя наследование одной таблицы, и принадлежат собранию.
Однако мне интересно, хороший ли это дизайн. (Мне это кажется неинтуитивным).
Что бы вы сделали в моей ситуации?
Спасибо.
Ответ №1:
Это приемлемо, но есть и другие способы, которые являются более чистыми. Вы могли бы создать свою Meeting
модель следующим образом:
has_and_belongs_to_many :users, :as => :studens
belongs_to :tutor, :foreign_key => 'tutor_id', :class_name => 'User'
Ваша User
модель:
has_and_belongs_to_many :meetings, :as => :meetings_taken
has_many :meetings_given, :foreign_key => 'tutor_id', :class_name => 'Meeting'
Таким образом, вам понадобятся только две модели.
// редактировать
Для предложения, принятия, отклонения,.. Я бы создал Invitation
модель user_id:integer
(приглашенный пользователь), meeting_id
(Благодаря этому вы знаете, кому разрешено приглашать других людей, потому что собрание принадлежит преподавателю), status:string
(ожидание, принято, могут быть варианты), возможно, explaination:text
(Когда кто-то захочет).
Комментарии:
1. Ваше решение очень естественное и интуитивно понятное. Однако преподаватель и студент выполняют разные действия (предлагают, принимают, отклоняют и т.д.) По отношению к каждой встрече. То есть для каждого события я должен где-то хранить такое действие. Как бы вы это реализовали?
2. Спасибо, Дэвид. Это похоже на то, что у меня есть. Поскольку у Invitation есть две разные роли, я создаю два класса, наследующих Invitation (или, в моем случае, участник). Интересно, должен ли я сделать так, чтобы приглашение наследовало пользователя напрямую.