Я бился головой о стену, пытаясь обернуть голову вокруг этого, так что любые указания будут очень признательны .. .
Я хочу, чтобы настройка системы User отражала следующую иерархию:
User
|- email address
|- password
|- billing information
|- contact information
|- account preferences
|
|=> Agent
|=> - agent-specific information
|=> - has_many Users
|=> - belongs_to Manager
|
|=> Manager
|=> - manager-specific information
|=> - has_many Agents, Users
|
|=> Administrator
|=> - can manage everything
У меня уже есть модель User
с настройками Devise и CanCan . для обработки аутентификации и авторизации, поэтому я знаю, как использовать роли, чтобы ограничить тип пользователя конкретными действиями и т. д.
Я не понимаю, как организовать эти отношения между подклассами как в моем коде Rails, так и в базе данных. Как видно из вышеизложенного, Агент
, Менеджер
и Администратор
все совместно используют информацию, содержащуюся в Пользователь
, но каждый из них имеет дополнительные функции. И информация, связанная с этим.
Я читал о STI , полиморфных ассоциациях и самореферентных ассоциациях .
Если я использую STI, таблица Пользователь
должна содержать поля для всех моих [ Агента
/ Менеджера
/ Администратора
] -специфическая информация, не так ли? Это сделало бы мою таблицу User
огромной, чего я бы хотел избежать.И наоборот, если я использую полиморфизм, разве мне не придется дублировать всю общую информацию в User
для всех других типов таблиц подкласса User
?
И добавлять в мое замешательство, я не могу понять, как ответ на вышеуказанный вопрос будет работать с отношениями между подклассами (например, Manager
has_many Agents
, но оба являются подклассами User
... ??).
Я был бы очень признателен, если бы кто-то разъяснил мне этот вопрос с помощью подробного ответа, в котором должным образом учитывались бы удобочитаемость кода и целостность данных, который просто объясняет (как если бы новичку в Rails), почему A - лучший подход и почему B или n - для сравнения - не очень хороший подход для этой ситуации, и это дает пример кода для реализации отношений, описанных выше. Я хочу решить эту проблему, но, что более важно, я хочу узнать , почему решение работает!