Проектирование базы данных для многоуровневых пользователей с рельсами - PullRequest
0 голосов
/ 19 октября 2011

У меня есть таблица базы данных для пользователей, которая содержит общие поля, такие как пароль, электронная почта и т. Д. А также есть поле с именем level, которое определяет уровень пользователя, например member , editor или admin .

Существуют также некоторые поля, предназначенные для членов, редакторов и администраторов, которые другим не нужны.Поэтому я думаю, что я должен создать отдельные таблицы для пользовательских типов.

И вот проблема; как мне подойти к этой проблеме, если я хочу идти по пути Rails? Как с точки зрения дизайна базы данных, так и ассоциаций.

1 Ответ

2 голосов
/ 20 октября 2011

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

.-------.1    *.------------.*     1.-------.
| users |<-----| user_roles |------>| roles |
'-------'      '------------'       '-------'
                     |
     .---------------+---------------------.
     |0..1           |0..1                 |0..1
 .--------.  .----------------------.  .----------.
 | points |  | some_other_attribute |  | room_ids |
 '--------'  '----------------------'  '----------'

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

Однако вы должны будете убедиться, что все ваши модели атрибутов обеспечивают соблюдение правил проверки, например:

class Point < ActiveRecord:Base
    validates :relevant_association?

  def relevant_association?
    user_role.role.title == "Admin"
  end
end

, если ваш пользователь может иметь только одну роль, вы можете упростить это, добавивrole поле модели, а затем напишите правила проверки для необязательных атрибутов (которые belong_to пользователь) соответственно.Тем не менее, предыдущая модель предлагает больший потенциал для будущих корректировок (создание новой роли - это просто создание новой записи).

Я не эксперт в этом вопросе, поэтому вы также можете продолжать искать вдохновение; Declarative_authorization gem предоставляет объяснение своей модели данных, которая также может быть вам интересна:

                     includes                   includes
                      .--.                        .---.
                      |  v                        |   v
.------.  can_play  .------.  has_permission  .------------.  requires  .----------.
| User |----------->| Role |----------------->| Permission |<-----------| Activity |
'------' *        * '------' *              * '------------' 1        * '----------'
                                                    |
                                            .-------+------.
                                         1 /        | 1     \ *
                               .-----------.   .---------.  .-----------.
                               | Privilege |   | Context |  | Attribute |
                               '-----------'   '---------'  '-----------'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...