Я все еще плохо знаком с рельсами и activerecord, поэтому прошу прощения за любые упущения.
У меня есть 3 модели, которые я пытаюсь связать (и 4-я для фактического связывания), чтобы создать схему разрешений с использованием пользовательских ролей.
class User < ActiveRecord::Base
has_many :user_projects
has_many :projects, :through => :user_projects
has_many :project_roles, :through => :user_projects
end
class Project < ActiveRecord::Base
has_many :user_projects
has_many :users, :through => :user_projects
has_many :project_roles
end
class ProjectRole < ActiveRecord::Base
belongs_to :projects
belongs_to :user_projects
end
class UserProject < ActiveRecord::Base
belongs_to :user
belongs_to :project
has_one :project_role
attr_accessible :project_role_id
end
Модель project_roles содержит определяемое пользователем имя роли и логические значения, определяющие, имеет ли данная роль разрешения для конкретной задачи. Я ищу элегантное решение, чтобы легко сослаться на него из любой части проекта.
У меня уже есть система ролей, реализованная для всего приложения. Что я действительно ищу, так это то, что пользователи смогут управлять своими ролями для каждого проекта. Каждый проект настраивается с неизменной ролью администратора по умолчанию, а создатель проекта добавляется при создании проекта.
Поскольку пользователи создают роли, я хотел бы иметь возможность извлекать список имен ролей из проекта и моделей пользователей через ассоциации (для целей отображения), но для тестирования доступа я хотел бы просто сослаться на них по тому, что они имеют доступ без ссылки на них по имени.
Возможно, что-то вроде этого?
def has_perm?(permission, user) # The permission that I'm testing
user.current_project.project_roles.each do |role|
if role.send(permission) # Not sure that's right...
do_stuff
end
end
end
Я думаю, что над этим у меня над головой, потому что я продолжаю рассуждать о том, как мне лучше всего это реализовать.