Я бился головой о стену, пытаясь обернуть голову вокруг этого, так что любые рекомендации были бы очень признательны ...
Я хочу, чтобы настройка системы пользователя отражала следующую иерархию:
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, так и в базе данных. Как видно из вышеизложенного, все Agent
, Manager
и Administrator
совместно используют информацию, содержащуюся в User
, но каждый из них имеет дополнительные функции И связанную с ним информацию.
Я читал кое-что о STI, полиморфные ассоциации и самореференциальные ассоциации.
Если я использую STI, таблица User
должна будет содержать поля для всей моей [_8 _ / _ 9 _ / _ 10 _] информации, верно? Это сделало бы мою User
таблицу огромной, чего я бы хотел избежать. И наоборот, если я использую полиморфизм, разве мне не придется дублировать всю общую информацию в User
на все другие типы User
таблиц подклассов?
И чтобы добавить к моему недоумению, я не могу обернуться вокруг того, как ответ на вышеупомянутый вопрос будет работать с отношениями между подклассами (например, что Manager
has_many Agents
, но оба являются подклассами _16 _...? ?).
Я был бы очень признателен, если бы кто-то объяснил мне это с помощью подробного ответа, в котором должным образом учитывались бы читаемость кода и целостность данных, который просто объясняет (как если бы новичку Rails), почему A - лучший подход и почему B или n - для сравнения - не лучший подход для этой ситуации, и это дает пример кода для реализации отношений, описанных выше. Я хочу решить эту проблему, но, что более важно, я хочу узнать, почему это решение работает!