【问题标题】:Paginating an Array in Ruby with will_paginate使用 will_paginate 在 Ruby 中对数组进行分页
【发布时间】:2012-10-22 15:08:15
【问题描述】:

我有一个数组@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 对此进行分页?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 will-paginate kaminari


    【解决方案1】:

    https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/array.rb

    在您尝试之前只需require 'will_paginate/array',它会工作得很好。如果是我,我会把它写在 config/initalizers/will_paginate_extensions.rb 中,这样它就可以立即在任何地方使用。

    【讨论】:

    • 这是一个更好的解决方案。谢谢!
    • @NathanColgate 如果您必须使用很多,那么也许可以。但是如果你只想在几个地方使用它,我不会用不属于他们责任的东西污染标准类。继承自 Array 并具有此方法的 PaginatedArray 可能是更好的方法。但我会选择 Chris 的解决方案。
    【解决方案2】:

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

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

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

    【讨论】:

    • 如果你有一个代表一个页面的对象数组(和总计数)并且想要使用各种 WillPaginate 视图助手 - 例如,如果你出于性能原因需要绕过 ActiveRecord,这非常有用。跨度>
    • 我尝试了这种方法并且成功了一半。它生成will_paginate 视图助手,但数组没有分解:生成了完整列表。视图中有什么特别需要的吗?
    • @Jerome 您需要仅使用当前页面的值填充值数组。然后你手动传入 current_page/per_page/整个集合中的值的总数,它构造了分页助手。
    • 这听起来合乎逻辑。换句话说,因为我要对数组进行排序,所以首先对数组进行排序,然后是 '@values.page(params[:page])` 或 .pagination[...],最后是:WillPaginate::Collection.create(1, 10, @values.length)。但是,这会为# undefined method page'... 这是在某个地方记录的吗?我一直在找……具体发帖stackoverflow.com/questions/23875093/…
    • 假设你不介意扩展 Array.如果您在一两个地方需要它,扩展 Array 可能是一种代码味道。 will_paginate/array 和这段代码完全一样,除了它把它扩展到 Array 上。
    【解决方案3】:

    在 Rails 项目中给定一个 collection 数组

    will_paginate ~>3.0.5
    
    collection.paginate(page: params[:page], per_page: 10)
    

    返回数组值的分页。

    不要忘记控制器顶部的require 'will_paginate/array'

    【讨论】:

    • 我认为数组不能调用paginate。这是我得到的错误:NoMethodError: undefined method paginate' for #<0x007fc983759000>
    【解决方案4】:

    这是我基于@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
    

    【讨论】:

      【解决方案5】:

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

      我想出了这个解决方案。

      # 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)
      

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

      话虽如此,因为我使用“delegate_missing_to”,所以你依赖于 rails。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-18
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        相关资源
        最近更新 更多