2012-12-21 54 views
4

用戶有權管理特定位置和類別組合的文章。聲明授權與特許加入表

例如Dave可能被允許管理巴黎的HR文章。保羅可能被允許管理倫敦的商業文章。是

的模型及其協會如下:

  • 用戶有很多權限
  • 權限屬於用戶,位置和類別
  • 類別有許多文章和權限
  • 位置都有很多文章和權限
  • 文章屬於位置和類別

我可以說:

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 

現在,當我在文章記錄中呼叫allowed_to?(:delete)(或讀取/更新/創建/管理)wh類別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管理權限。 您可以擁有頂級文章,然後所有類型的文章都可以是子類,並且在您使用cancan管理其權限的子類中。

0

這應該是一個評論,但我仍然在45 :(

你說permission屬於userlocationcategory。 因此,權限表將具有USER_ID,LOCATION_ID和CATEGORY_ID列。

如果這是真的,那麼你爲什麼要宣稱belongs_to類別權限和位置belongs_to允許嗎?當然的關係應該是has_many

您應該在模型上使用has_many,該模型沒有外鍵(類別和位置),並且在模型WHICH DOES(許可)上使用belongs_to

請原諒我,如果所有這些都只是您製作的拼寫錯誤,並且您的真正含義是belongs_to用戶和has_many位置和類別。

+0

你是對的 - 權限屬於用戶,位置和類別,而用戶,位置和類別各自擁有許多權限 - 我已更正問題。乾杯。 – marc