1

) 내 응용 프로그램의 DB 관계를 디자인하는 가장 좋은 방법을 찾으려고합니다. 나는 many-to-many 관계를 가지고 있습니다. 그러한 관계의 예가 다음과 같습니다.다 대다 관계에 대한 조인 테이블과 함께 Rolify 사용 (

class User < ApplicationRecord 
    has_many :groups_users 
    has_many :groups, through: :groups_users 
end 

class Group < ApplicationRecord 
    has_many :groups_users 
    has_many :groups, through: :groups_users 
end 

class GroupsUser < ApplicationRecord 
    belongs_to :group 
    belongs_to :user 
end 

이렇게하면 어떤 사용자가 어떤 그룹에 속하는지 정의 할 수 있습니다. 그러나 그룹에 대한 액세스 수준이 무엇 인지도 알아야합니다. 그래서 groups_users 테이블에 나는이 모든 설정이 잘 작동 그룹의 관리자, 나는

u = User.find(34) 
g = Group.find(22) 
gu = u.groups_users.where(:group => g).first 
gu.update(admin: true) 

같은 것을 할 거라고 사용자를 만들고 싶었다 경우 등 관리자, 기여, 같은 추가 속성이 있지만 Rolify를 사용하고 있는데이 상황에서 적용될 수있는 것처럼 보입니다.

u = User.find(34) 
g = Group.find(22) 
u.add_role(:admin, g) 

나는 그래서 내가이 작업을 수행 할 수 있고 제거 생각 Rolify의 아이디어를 좋아하지 : Rolify은 제가 이런 짓을 했을까 위를 이렇게하려면, 클래스의 인스턴스에 대한 사용자의 역할을 설정할 수 있습니다 조인 테이블의 추가 속성 하지만 지금은 사용자가 어떤 그룹 (u.groups)을 가지는지 조인 테이블을 사용하고 있기 때문에 믹싱과 매칭을하고있는 것처럼 느껴지고 있습니다. 그런 다음 Rolify를 사용하여 각 그룹에 대한 액세스 수준을 어떻게 든 얻으려고합니다. 어쩌면 그렇게 할 수있는 방법 일지 모르지만, Rolify를 사용하고 조인 테이블을 모두 제거 할 수 있다는 생각이 들었습니다. 다음과 같이 말하면 "기본"역할을 추가하기 만하면됩니다. 그래서 u.groups을 사용하여 사용자 그룹을 얻는 대신 Group.with_role(:member, u)을 할 것입니다. 나는 u.groups = [g1, g2, g3]과 같은 일을 할 수있는 능력이 없지만 각 그룹에 대한 사용자 액세스 수준을 설정하기 위해 이미 약간 혼란 스러울 것입니다.

그래서이 작업을 수행하는 방법에 대한 권장 사항을 찾고있는 것 같습니다. 나는 사용자와 관련된 많은 일대 다 관계를 가지고 있으며 Rolify를 사용하여 그 모든 것을 처리 할 생각을 좋아하므로 조인 테이블과 클래스가 많지는 않지만 Rolify에 새로운 사람으로 (그리고 처음에는이 전문가의 전문가가 아닙니다.)이 방법으로 함정을 놓치고 있는지 확실하지 않습니다.

답변

0

Rolify는 다음 코드와 같이 범위가 지정된 역할을 허용합니다. Rolify 위키에서 복사했습니다.

user = User.find(2) 
user.add_role :moderator, Forum.first # sets a role scoped to a resource instance 
user.has_role? :moderator, Forum.first 
=> true 
user.has_role? :moderator, Forum.last 
=> false 

당신은 특정 사용자 user_groups에서 scoped role을 추가하는 것을 고려 할 수 있습니다. 예를 들어 user_a '의 역할은 admin이고 group_a으로 제한됩니다.

user_a = User.create(name: 'user a') 
group_a = Group.create(name: 'group a') 
group_a.users << user_a 
user.add_role :admin, UserGroup.first