Лучше ли иметь роли в виде столбца в моей таблице пользователей, или это можно сделать с помощью таблиц объединения (роли и назначения)? - Рельсы 3 - PullRequest
2 голосов
/ 07 января 2011

Вы можете посмотреть мои модели здесь:

https://gist.github.com/768947

Просто, чтобы объяснить, что происходит, у меня есть несколько моделей. В основе моего приложения лежат: проекты, этапы, загрузки, комментарии, пользователи. Тогда есть роли и назначения для управления авторизацией пользователя.

Я делаю это с помощью плагина Declarative_authorization & devise для входа в систему.

Итак, первый вопрос: лучше ли просто добавить столбец «Роли» в мою модель / таблицу пользователей и сохранить там роли для каждого пользователя? Если у меня есть пользователь с несколькими ролями, тогда я могу просто сохранить все роли в виде массива и циклически просматривать их по мере необходимости.

Или лучше сделать это так, как у меня сейчас настроено, где я использую две отдельные таблицы и несколько объединений для настройки назначений? У меня только 4 роли: дизайнер, клиент, администратор, суперпользователь.

Лучше в том смысле, что каждый запрос со столбцом «дешевле» с точки зрения вычислительных ресурсов, чем с объединениями, или разница не столь значительна?

Полагаю, корень моего вопроса ... прямо сейчас, если я хочу получить проект, назначенный для current_user, я просто делаю current_user.projects.each do |project| и циклически перебираю их таким образом. Это после того, как я сделал: @projects = current_user.projects в контроллере проектов. То же самое относится ко всем другим моим моделям - кроме пользователей и ролей.

Однако, если бы я захотел найти пользователя с ролью «клиент», он очень быстро запутался. Или я это слишком усложняю?

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 07 января 2011

Я думаю, что лучше иметь таблицы пользователей и ролей, которые разделены. Это отношение «многие ко многим», потому что у пользователя может быть много ролей, а у многих пользователей может быть одинаковая роль. Для этого вам понадобится таблица JOIN (например, user_role). Я бы порекомендовал три стола. Конечно, у вас будут первичные ключи как для пользователя, так и для роли; таблица user_role будет иметь два столбца, по одному для каждого первичного ключа, и связи внешнего ключа с соответствующими таблицами.

Так что теперь, если вы хотите, чтобы все пользователи с ролью «клиент», это просто СОЕДИНЕНИЕ между user и user_role. Если вам нужны роли конкретного пользователя, вам нужно присоединиться к трем таблицам.

Я бы не рекомендовал массив ролей в пользователе. Это идет вразрез с первой нормальной формой.

...