2009-12-09 2 views
0

액세스 제어 규칙을 기반으로 범위를 좁힌 검색에 대한 우아한 해결책을 찾아야합니다. - 사용자가Rails의 액세스 제어 규칙에 따라 범위가 지정된 검색을 수행하는 가장 좋은 방법은 무엇입니까?

사용자가 자신의 고객 있지만, 다른 사용자도 공유 고객뿐만 아니라 액세스 할 수 있어야 다른 사용자가 데이터에 액세스 할 수있는 정의

사용자 고객 AccessControl입니다 : 기본적으로 나는 다음과 같은 설정이있다.

물론 간단한 협회 같은 작동하지 않습니다 :

has_many :customers 

을하고 어느 것이 : 협회는 with_scope를 사용하고 추가 조건은 OR 조건는 AND 조건을하지

has_many :customers, :conditions => 'user_id in (1,2,3,4,5)' 

때문에 .

나는이 같은 협회 확장자 찾기 및 method_missing 방법을 재정의하는 시도 :

has_many :customers do 
    def find(*args) 
    #get the user_id and retrieve access conditions based on the id 
    #do a find based on the access conditions and passed args 
    end 

    def method_missing(*args) 
    #get the user_id and retrieve access conditions based on the id 
    #do a find based on the access conditions and passed args 
    end 
end 

을하지만 문제는 내가 확장 메서드 내부의 사용자 개체/부모 개체에 대한 액세스 권한이 없다는 것입니다 계획대로 작동하지 않습니다.

또한 default_scope를 시도했지만 여기에 게시 된대로 블록을 기본 범위로 전달할 수 없습니다.

아무튼 데이터 분할 및 데이터 액세스 제어가 레일을 사용하기 전에 완료되었으며 누군가가 우아한 방법을 찾았는지 궁금합니다.

UPDATE : AccessControl입니다 테이블은 다음과 같은 레이아웃이

고객 테이블이 구조가
user_id 
shared_user_id 

:

id 
account_id 
user_id 
first_name 
last_name 

AccessControl입니다 테이블에있을 것이다 다음 데이터를 가정 :

1 1 
1 3 
1 4 
2 2 
2 13 
and so on... 

그리고 사용자 1의 account_id는 13 나는 가장 다음과 같은 SQL 문을 설명 할 수있는 고객을 검색 할 수 있어야합니다 : 나는 완전히 여기에 포인트를 놓친 경우

select * from customers where (account_id = 13 and user_id = null) or (user_id in (1,3,4)) 

답변

0

미안하지만 난 당신이 원하는 것을 100 % 확실하지 않다 해야 할 것. AccessControl은 사용자와 고객 간의 관계입니까? 그렇게 보인다면 다 대다 관계를 설정하기 만하면됩니다.

class User 
    has_and_belongs_to_many :customers 

    # or this if you need to store meta data in the join table 

    has_many :customers 
    has_many :access_controls 
    has_many :accessible_customers, through => :access_controls 
end 
+0

AccessControl은 현재 디자인에서 사용자와 고객 간의 관계/조인 테이블입니다. 그러나 연고에 작은 파리가 있습니다. 고객 데이터는 사용자 ID (이 경우 has_many through가 작동 할 수 있음)뿐만 아니라 account_id (모든 사용자의 부모 개체)에 의해 범위가 지정되어야합니다. 이유는 다음과 같습니다. 사용자가 삭제되면 고객 개체의 user_id가 null이되고 제한 범위가 account_id로 되돌아갑니다. 짐승은 이것을 설명하기 위해 SQL을 사용합니다 : select * from customers (account_id = 13 및 user_id = null) 또는 (1, 3, 5, 6)의 user_id) –

관련 문제