Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Paginating an Array in Ruby with will_paginate

I have an array @level1 which looks like this :

[[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4], ............]

I want to apply pagination on this array such each page displays only a few rows at once. I tried this:

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

But it throws the following error:

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

How can I perform pagination on this using will_paginate?

like image 755
Pi Horse Avatar asked Nov 01 '12 23:11

Pi Horse


People also ask

Can you Paginate an array?

Method: Array#paginate Paginates a static array (extracting a subset of it). The result is a WillPaginate::Collection instance, which is an array with a few more properties about its paginated state. Parameters: :page - current page, defaults to 1.


4 Answers

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

Just require 'will_paginate/array' before you try it and it will work just fine. If it were me, I'd put that in say config/initalizers/will_paginate_extensions.rb so it's available right away and from everywhere.

like image 148
Philip Hallstrom Avatar answered Oct 04 '22 15:10

Philip Hallstrom


Sure, you can use WillPaginate::Collection to construct arbitrary pagination across collections. Assuming an array called values:

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

You can then treat @values just like any other WillPaginate collection, including passing it to the will_paginate view helper.

like image 36
Chris Heald Avatar answered Oct 04 '22 16:10

Chris Heald


Given a collection array in a Rails project

will_paginate ~>3.0.5

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

returns the pagination for the array values.

Do not forget require 'will_paginate/array' on top of the controller.

like image 43
Francisco Quintero Avatar answered Oct 04 '22 17:10

Francisco Quintero


This is my example based in the answer of @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
like image 37
Alberto Camargo Avatar answered Oct 04 '22 17:10

Alberto Camargo