Paginating Array в Ruby с will_paginate
У меня есть массив @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?
Ответы
Ответ 1
Конечно, вы можете использовать WillPaginate::Collection
для создания произвольной разбивки на страницы в коллекциях. Предполагая массив с именем values
:
@values = WillPaginate::Collection.create(current_page, per_page, values.length) do |pager|
pager.replace values
end
Затем вы можете обрабатывать @values
так же, как и любую другую коллекцию WillPaginate, включая передачу ее в помощник вида will_paginate
.
Ответ 2
См. https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/array.rb
Просто require 'will_paginate/array'
, прежде чем попробовать, и он будет работать нормально. Если бы это был я, я бы сказал, что сказал config/initalizers/will_paginate_extensions.rb
, чтобы он был доступен сразу и везде.
Ответ 3
Учитывая массив collection
в проекте Rails
will_paginate ~>3.0.5
collection.paginate(page: params[:page], per_page: 10)
возвращает разбиение на страницы для значений массива.
Не забывайте require 'will_paginate/array'
поверх контроллера.
Ответ 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".