使用will_paginate在Ruby中对数组进行分页

34
我有一个名为@level1的数组,它看起来像这样:
[[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4], ............]

我想在这个数组上应用分页,使每个页面一次只显示几行。我尝试了以下代码:

@temp1 = @level1.paginate(:page => params[:page])

但是它会抛出以下错误:

undefined method `paginate' for [[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4]]:Array

我该如何使用will_paginate对此进行分页?

5个回答

82

2
这是一个更好的解决方案。谢谢! - Nathan Colgate
1
如果你要经常使用的话,那么也许是的。但如果你只想在几个地方使用它,我不会用一些不是它们职责的东西来污染标准类。一个继承自Array并具有这种方法的PaginatedArray可能是更好的选择。但我会采用Chris的解决方案。 - iGEL

27

当然,您可以使用WillPaginate :: Collection在集合中构建任意分页。 假设有一个名为values的数组:

@values = WillPaginate::Collection.create(current_page, per_page, values.length) do |pager|
  pager.replace values
end

您可以像对待其他WillPaginate集合一样处理@values,包括将其传递给will_paginate视图助手。


1
如果您有一个表示一个页面(和总计数)的对象数组,并且想要使用各种WillPaginate视图助手,那么这个很棒-例如,如果您需要为性能原因绕过ActiveRecord。 - user1454117
1
我尝试了这种方法,取得了一半的成功。它生成了 will_paginate 视图助手,但是数组没有被分解:完整的列表被生成了。视图中需要特别的东西吗? - Jerome
1
@Jerome 你需要将values数组填充为当前页面的值。然后手动传入current_page/per_page/整个集合中值的总数,它会构建分页助手。 - Chris Heald
建议您使用will_paginate/array是一个更好的解决方案。 - Aaron B. Russell
1
假设您不介意扩展数组。如果您只需要在一个或两个地方使用它,那么扩展数组可能是一种代码异味。will_paginate/array 正好可以完成此代码的工作,除了它将其扩展到数组上。 - Chris Heald
显示剩余2条评论

5
在一个Rails项目中给定一个名为collection的数组。
will_paginate ~>3.0.5

collection.paginate(page: params[:page], per_page: 10)

返回数组值的分页。

不要忘记在控制器顶部添加require 'will_paginate/array'


2
我认为数组不能调用 paginate。这是我得到的错误:NoMethodError: undefined method paginate' for #Array:0x007fc983759000`。 - Anthony To
1
@AnthonyTo,你漏掉了需要引入will_paginate/array这一部分。 - Thomas R. Koll

2

这是基于@chris-heald答案的示例

products = %w(i love ruby on rails)
@products = WillPaginate::Collection.create(params[:page], params[:per_page], products.length) do |pager|
   pager.replace products[pager.offset, pager.per_page]
end

0

我对这个帖子中提供的答案并不满意。

我想出了这个解决方案。

# app/lib/paged_array.rb

require 'will_paginate/array'

class PagedArray
  delegate_missing_to :@paged_collection

  def initialize(collection, page: 1, per_page: 20)
    @paged_collection = collection.paginate(
      page: page,
      per_page: per_page
    )
  end
end

你可以像这样使用它:

superheroes = %w[spiderman batman superman ironman]

PagedArray.new(superheroes, page: 1, per_page: 2)

我喜欢这个解决方案,因为它很明确,而且不会污染你的标准类。

话虽如此,你还是依赖于Rails,因为我使用了“delegate_missing_to”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接