【发布时间】:2014-03-10 03:25:46
【问题描述】:
我有一个群组页面,其中显示了所有成员的列表。 GroupsController#show 的代码看起来像这样
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
我们在我们的应用程序中使用 CanCan 授权,我想将显示的成员限制为用户实际上可以:read
这样的工作:
@members = @group.members.order(:last_name, :first_name).select{|member| can? :read, member}
@members = @members.paginate(params[:page], per_page: 25)
但据我了解,它会破坏分页的性能优势,即它会首先从数据库中加载所有成员,然后选择可见的成员。 像这样交换它
@members = @group.members.order(:last_name, :first_name)
@members = @members.page(params[:page]).per_page(25).select{|member| can? :read, member}
也不行,因为视图需要一个特定的 WillPaginate::Collection 以及页数、当前页面等元信息 - 而不是一个简单的数组。
有没有正确的方法来做到这一点,比如在关系和分页之间链接一个 Proc? 我的 google fu 让我失望了。
完整代码见github
【问题讨论】:
标签: ruby-on-rails performance pagination cancan will-paginate