Хороший вопрос! Я думаю, что это одна вещь, которую WillPaginate на самом деле не учитывает. Я собираюсь посмотреть на код WillPaginate здесь, но я на самом деле не тестировал это решение. Если вы собираетесь попробовать, дайте мне знать, сработало ли это для вас.
Логика хорошо отделена, в WillPaginate::Collection
. Вам нужно изменить поведение методов offset
и total_entries=
. Вы можете сделать это с помощью подклассов, но это означает, что вы больше не можете использовать специальный paginate
искатель, к сожалению. (Он имеет WillPaginate::Collection
жестко закодированный.)
У вас может быть что-то вроде следующего, возможно, в вашем lib/
:
class SlidingWindowCollection < WillPaginate::Collection
def offset
current_page - 1
end
def total_entries=(number)
@total_entries = number.to_i
@total_pages = [@total_entries - per_page, 1].max
end
end
И тогда ваш пример кода будет выглядеть так:
@asset_set_scope = @provider.active_resources(:include => {:active_services => :latest_approved_version})
@asset_set = SlidingWindowCollection.create(params[:page], RESOURCES_IN_DAY_VIEW, @asset_set_scope.count) do |pager|
pager.replace(@asset_set_scope.all(:offset => pager.offset, :limit => pager.per_page, :order => sort_order))
end
Использование немного сложнее, я полагаю. Все дополнительные функции обычно обрабатываются специальным искателем paginate
, таким как вычисление общего количества записей и выбор правильных записей. Я полагаю, вы могли бы создать помощника, если вы собираетесь это делать часто.