Rails: PolyMorphic или STI или что-то еще для управления пользователями?

Я бился головой о стену, пытаясь обернуть голову вокруг этого, так что любые указания будут очень признательны .. .

Я хочу, чтобы настройка системы 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 - для сравнения - не очень хороший подход для этой ситуации, и это дает пример кода для реализации отношений, описанных выше. Я хочу решить эту проблему, но, что более важно, я хочу узнать , почему решение работает!

6
задан neezer 11 December 2010 в 16:28
поделиться