2010-01-18 3 views
1

나는 단순한 declarative_authorization 규칙 인 것처럼 보였습니다.하지만 그것이 작동하도록하는 데 문제가 생기는 것은 제가 새로 발견 한 것입니다.declarative_authorization의 is_in 연산자를 사용하는 방법은 무엇입니까?

사용자와 그룹이 있습니다. 그룹은 사용자와 다 대일 관계를 맺습니다. 특정 클래스 (:asset)에는 사용자 & 그룹이 연관 될 수 있습니다. 사용자가 :asset 개체 그룹의 구성원 인 경우 :asset 개체에 대한 권한을 확인하고 싶습니다. 기본적으로 UNIX 파일 시스템 보안 모델을 생각해보십시오. 여기

내가 작성한 규칙입니다 :

has_permission_on [:assets], :to => :manage do 
    if_attribute :user => is { user } 
    if_attribute :group => is { user.default_group } 

    # Idea: 
    # if_attribute :group => is_in { user.groups } 

end 

내가 코드에 내 "아이디어"를 포함 찾고 있어요,하지만 오류가 발생합니다. 어리석은 짓이라 확신 해요. 뭐가 확실하지 않나요?

SQLite3::SQLException: ambiguous column name: created_at: 
    SELECT "assets"."id" AS t0_r0, "assets"."friendly_id" AS t0_r1, "assets"."purchased_on" AS t0_r2, "assets"."description" AS t0_r3, "assets"."model" AS t0_r4, "assets"."serial" AS t0_r5, "assets"."user_id" AS t0_r6, "assets"."created_at" AS t0_r7, "assets"."updated_at" AS t0_r8, "assets"."group_id" AS t0_r9, "groups"."id" AS t1_r0, "groups"."name" AS t1_r1, "groups"."created_at" AS t1_r2, "groups"."updated_at" AS t1_r3 
    FROM "assets" 
    LEFT OUTER 
    JOIN "groups" 
    ON "groups".id = "assets".group_id 
    WHERE ((1=1) OR ("assets"."user_id" = 1) OR ("groups"."id" IN (1,2,3))) 
    ORDER BY created_at DESC 
    LIMIT 10 
    OFFSET 0 

답변

1

필자는 실제로 declarative_auth에 많은 것을 파고 들지 않았지만 규칙은 괜찮은 것 같습니다. 로그를 기반으로 'groups'테이블에도 'created_at'컬럼이 있으므로 order by created_at이 모호한 것 같습니다.

테이블 솔루션을 바로 잡는 방법을 모르겠지만 order by t0_r7 또는 order by t1_r2은 created_at 열에 주어진 별칭이므로 수정해야한다고 생각합니다. 당신이 사용하는 것이 당신에게 중요한지 나는 모른다.

+0

고맙습니다. 자와 (Jawa). 그것은 저에게 답을 찾기에 충분한 데이터를주었습니다 ... 기본적으로 일부 모델에는 명시적인 order_by 문 등이있었습니다.이 order_by 문에는 테이블 이름으로 정규화 된 열이 필요했습니다. 어떤 의미가 있습니다. 두 오류를 연결하지 않았습니다. decl_auth가 장면 뒤에서 조인을하고 있기 때문에 나는 order_by도하고 있다고 가정하고있었습니다. 그러나 그것은 나이었다! :( – dpb

관련 문제