【问题标题】:How to combine the advantages of pagination with authorization如何结合分页和授权的优势
【发布时间】: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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多