2012-12-21 3 views
4

사용자는 특정 위치 및 카테고리 조합에 대해 기사를 관리 할 수있는 권한이 있습니다.permissons 조인 테이블이있는 선언적 승인

예를 들어 Dave는 파리의 HR 기사를 관리 할 수 ​​있습니다. Paul은 런던의 비즈니스 기사를 관리 할 수 ​​있습니다. 다음과 같이

모델과 협회는 다음과 같습니다

  • 사용자가
  • 권한을 사용자, 위치 및 카테고리에 속하는 많은 권한이
  • 위치가 많은 기사를 가지고 분류는 많은 기사와 권한이
  • 및 허가
  • 기사는 위치와 범주에 속합니다

내가 말할 수 :

has_permission_on :articles, :to => :manage do 
    if_attribute :location => { :permissions => { :user_id => is {user.id} }, :category => { :permissions => { :user_id => is {user.id} } } 
end 

을 내가 permitted_to 호출하면? (: 삭제) (그 카테고리 ID 1893과 위치 ID 2939입니다) 문서 기록에서 다음 쿼리가 실행됩니다

SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 1893 LIMIT 1 
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893) 
SELECT `locations`.* FROM `locations` WHERE `locations`.`id` = 2939 LIMIT 1 
SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.location_id = 2939) 

내가 실행해야하는 것은 정말이 달성 할 수있는 방법은

SELECT `permissions`.* FROM `permissions` WHERE (`permissions`.category_id = 1893 AND `permissions`.location_id = 2939) 

있습니까?

미리 감사드립니다.


업데이트

좋아, 그래서 지금은 문서 모델의 인스턴스 방법이 있습니다

def permitted_user_ids 
    Permission.select('user_id').where(:location_id => location_id, :category_id => category_id).map(&:user_id) 
end 

을 내 규칙은 지금 :

has_permission_on :articles, :to => :manage do 
    if_attribute :permitted_user_ids => contains { user.id } 
end 

이제 때 기사 레코드 wh에 대해 permitted_to? (: delete) (또는 읽기/업데이트/생성/관리)를 호출합니다. ose category id가 1893이고 위치 ID가 2939이면 다음 쿼리가 실행됩니다.

SELECT user_id FROM `permissions` WHERE `permissions`.`category_id` = 1893 AND `permissions`.`location_id` = 2939 

... 정확히 내가 원하는 것입니다.

with_permissions_to 범위가 매우 이상하게 작동하는 것을 제외하고는.

Article.with_permissions_to(:read) 

지금 생성

SELECT `articles`.* FROM `articles` WHERE (`articles`.`id` = 9473) 

... 9473은 현재 사용자의 ID입니다!

나는 매우 혼란 스럽다.

답변

0

서브 클래스를 사용하고 cancan으로 권한을 관리 할 수 ​​있습니다. 최상위 클래스 아티클을 가질 수 있으며 모든 종류의 아티클은 하위 클래스가 될 수 있으며 하위 클래스에서는 캔 캔을 사용하여 권한을 관리합니다.

0

당신은 permission가 속한 말을 user, locationcategory합니다. 는 따라서, 권한 테이블이 USER_ID, location_id와 CATEGORY_ID 열 것이 코멘트해야하지만, 나는 45 :(

아직입니다.

그게 사실이라면, 왜 그 카테고리 belongs_to 허가 및 위치 belongs_to 권한을 선포? 분명히 관계가 있어야한다 has_many?

외래 키 (카테고리 및 위치)가없는 모델에서는 has_many을 사용해야하고 모델 (허 용)에서는 belongs_to을 사용해야합니다.

이 모든 것이 오타이기는하지만 사용자가 실제로 소유 한 권한은 belongs_to user와 has_many 위치 및 카테고리 인 경우 용서해주세요.

+0

당신이 맞습니다 - 권한은 사용자, 위치 및 카테고리에 속하며 사용자, 위치 및 카테고리에는 각각 많은 권한이 있습니다 - 나는 그 질문을 수정했습니다. 건배. – marc