4

我正在使用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}, 3rdpage 会用新元素更新到{i, h, g},并且会有一个新的页面 4 有一个元素{j}

4

3 回答 3

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}
于 2013-03-17T13:47:59.730 回答
0

注意:这个答案是从另一个 Stackoverflow 问题交叉发布的。

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

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。他还主持了该应用程序作为工作演示

于 2013-03-18T10:22:49.300 回答
0

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

在这里发布我的答案。

于 2014-04-06T17:46:55.387 回答