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