【问题标题】:Reverse pagination with kaminari?用 kaminari 反向分页?
【发布时间】:2013-01-10 23:06:02
【问题描述】:

我正在使用 Kaminari 0.13.0 和 RubyOnRails 3.2.8。

假设我的元素默认排序为crated_at,我的列表中有8 元素{a, b, c, d, e, f, g, h},并且我将它们分页3 每页。

默认情况下,kaminari 将创建以下页面链接 1, 2, 3 链接到 {h, g}{f, e, d}{c, b, a}

如何让 kaminari 以反向顺序创建页面链接? 我希望它以反向顺序生成链接 3, 2, 1 仍然链接到反向排序元素 {h, g}{f, e, d}{c, b, a}.

关于我要解决的问题的一些背景信息:

我通过 created_at 对页面上的元素进行排序。我想让元素永远保持在同一页面上。如果我不使用反向分页,则每次添加新元素时页面内容都会发生变化。因此,在上面带有默认 kaminari 行为的示例中,如果我向列表 {i, j} 添加更多元素,那么 1st 页面将包含 {j, i, h},而不是像以前那样包含 {h, g}2nd 页面将包含 {g, f, e} 而不是以前的 {f, e, d} 等... 这对簿记、搜索引擎优化等不利。

如果我有上面描述的反向页码,那么1st 页面仍然有{c, b, a}3rd 页面将使用新元素更新为{i, h, g},并且会有一个新的第 4 页一个元素{j}

【问题讨论】:

  • 请尽快升级到 Rails 3.2.11
  • 通常这个问题可以通过链接说“旧帖子”或“下一页”来解决。这是你愿意接受的吗?
  • @JesseWolgamott 我不确定我理解你的意思。较早的帖子和下一页链接与我上面描述的问题无关。它们只是帮手,不同数据出现在同一页面上的问题仍然存在。
  • 当然,那不用担心。我认为您必须为此编辑 kaminari 源或去非 kaminari。这不是大多数人试图解决的问题。

标签: ruby-on-rails kaminari


【解决方案1】:

我找到了解决办法:

def index
  users_scope = Users.order(:whateva)
  @users = reverse_paginate(users_scope, params[:page])
end

def reverse_paginate(scope, page)
  if page
    page_number = page
  else 
    page_number = Kaminari.paginate_array(scope.reverse).page(1).per(10).num_pages
  end
  Kaminari.paginate_array(scope.reverse).page(page_number).per(10).reverse!
end

您需要更新 kaminari 页面视图 _page.html.erb 并将 ?page=1 添加到 url:

   url = "#{url}?page=1" if page.number == 1
   link_to_unless page.current?, page.number, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil}

【讨论】:

    【解决方案2】:

    注意:此答案是从another Stackoverflow question 交叉发布的。

    在 Github 上有一个很好的示例 repo,在 github 上称为 reverse_kaminari。它建议按照这些思路实现(Source)

    class CitiesController < ApplicationController
    
      def index
        @cities = prepare_cities City.order('created_at DESC')
      end
    
      private
    
      def prepare_cities(scope)
        @per_page = City.default_per_page
        total_count = scope.count
        rest_count = total_count > @per_page ? (total_count % @per_page) : 0
        @num_pages = total_count > @per_page ? (total_count / @per_page) : 1
    
        if params[:page]
          offset = params[:page].sub(/-.*/, '').to_i
          current_page = @num_pages - (offset - 1) / @per_page
          scope.page(current_page).per(@per_page).padding(rest_count)
        else
          scope.page(1).per(@per_page + rest_count)
        end
      end
    
    end
    

    所有学分都转到Andrew Djoga。他还将应用程序托管为a working demo

    【讨论】:

      【解决方案3】:

      Kaminary.paginate_array 不会产生带有偏移量和限制的查询。出于优化原因,您不应该使用它。

      发布我的答案here

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 2011-08-02
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2012-02-18
        相关资源
        最近更新 更多