Подтвердить что ты не робот

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?

4b9b3361

Ответ 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".