Rails несколько ролей, определенных во взаимоотношениях с третьей стороной

#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 (или, в моем случае, участник). Интересно, должен ли я сделать так, чтобы приглашение наследовало пользователя напрямую.