2009-10-29 65 views
4

我很新的軌道,這是我第一次真正使用authlogic + acl9。我遵循這兩個插件的默認安裝步驟。acl9找到只是模型對象滿足object.accepts_role?(role_name,current_user)

到目前爲止,一切都很正常,但我有麻煩找到這個問題的一個優雅的解決方案:

比方說,我有一個叫產品模型類。當創建一個新的產品對象我指定CURRENT_USER作爲所有者:

current_user.has_role! :owner, @product 

我註冊了第二個用戶,並確保這部分工作。

在產品控制器我有一個指數的方法,簡單地返回所有產品:

def index 
    @products = Products.all 
end 

我的問題是:我如何呼籲產品find方法才能得到的只是那些產品,其中CURRENT_USER是主人? 所以我使用acl9接口,這將意味着:

@product.accepts_role?(:owner, current_user) 

一種可能性很可能會先檢索所有的產品,然後創建只是CURRENT_USER那些新的陣列。所以可能是這樣的:

@products = [] 
products = Products.all 
products.each do |p| 
    @products << p if p.accepts_role?(:owner, current_user) 
end 

這個解決方案看起來很浪費。那麼,正確的做法是什麼?

謝謝大家!

回答

1

怎麼樣都做在一個查詢:

@products = Product.all.select { |p| p.accepts_role?(:owner, current_user)} 

但這個想法仍然是提出自己

0

我最近在我正在研究的一個項目中得出了同樣的結論。

我很想在產品表上對角色和角色用戶表進行一些連接,但最終卻採用了上述方法。

現在運行良好,但不能很好地擴展。

0

我不確定你爲什麼要做任何連接。如果您已經遵循acl9的默認設置,則應該在用戶和他的角色之間建立多對多關係,並且在角色和每個授權對象之間應該有多對一的關係。所以,如果你在你的模型正確指定所有的關係,你應該能夠檢索與作爲

current_user.roles.find(:first, :conditions => { :name => 'owner' }).products

簡單的東西你可能需要特別說明的產品作爲角色命名的範圍或者關聯的對象模型,並且通過將該查找器包裝到命名範圍中,您甚至可以更簡化整個事件。

+0

您不能保證產品的第一個':owner'角色將成爲產品的角色,也許他們也擁有其他東西,在這種情況下'產品'將是零。 – smathy 2015-01-22 22:01:04

+0

另外,'Role'上不會有'產品'方法 – smathy 2015-01-22 22:03:29

0

這些範圍添加到您的Product型號:

scope :roled_by, -> (r, u) { where id: u.role_objects.select(:authorizable_id).where(:name => r, :authorizable_type => self) } 
scope :owned_by, -> (u) { roled_by :owner, u } 

...並將其命名爲:Product.owned_by current_user - 您可以使用相同的模式添加許多其他角色範圍(如果您願意,也可以調用Product.roled_by :owner, current_user)。

哦,並且注意到我已經使用了默認的role_objects方法,如果您已經將其設置爲別的東西(因爲這很常見),然後在範圍中調整它。