2014-02-20 52 views
1

我有一個組頁面,其中顯示了所有成員的列表。 的GroupsController#的代碼顯示看起來是這樣的如何將分頁的優勢與授權相結合

def show 
    if @group 
     @members = @group.members.order(:last_name, :first_name) 
     @members = @members.page(params[:page]).per_page(25) # pagination 
    end 
    respond_with @group 
    end 

我們在應用程序中使用授權與慘慘,和我想限制所顯示的成員的,用戶實際上可以:read

事情是這樣工作的:

 @members = @group.members.order(:last_name, :first_name).select{|member| can? :read, member} 
     @members = @members.paginate(params[:page], per_page: 25) 

但據我瞭解它會破壞分頁的性能優勢,那就是它WOU首先加載數據庫中的所有成員,然後選擇可見的成員。 交換它周圍像

 @members = @group.members.order(:last_name, :first_name) 
     @members = @members.page(params[:page]).per_page(25).select{|member| can? :read, member} 

也不行,因爲該視圖需要一個特定的WillPaginate ::收集與喜歡的頁數,當前頁面等的元信息 - 而不是一個簡單的數組。

有沒有一種正確的方法來做到這一點,例如鏈接關係和分頁之間的Proc? 我的谷歌福正在失敗我。

完整的代碼可以在github

回答

1

可以看出,您可以使用accessible_by首先要限制你的結果與當前用戶可以查看:

@members = @group.members.accessible_by(current_ability).order(:last_name, :first_name 
@members = @members.page(params[:page]).per_page(25) # pagination 

詳情請參閱https://github.com/ryanb/cancan/wiki/Fetching-Records