Элементы массива Rails разбиваются на страницы по порядку, а не постранично - PullRequest
2 голосов
/ 08 июня 2010

У меня есть группа активов, давайте назовем их «практикующими». Я показываю этих практикующих в заголовке интерфейса календаря. В календаре 7 столбцов. 7 столбцов = 7 практикующих за просмотр / страницу. Прямо сейчас:

если на первой странице показаны практикующие 1-7, когда вы перейдете на следующую страницу, вы увидите практикующих 8-15, следующую страницу 16-23 и т. Д. И т. Д.

Мне интересно, как разместить практикующих так, чтобы, если на первой странице показаны практикующие 1-7, на следующей странице будут показаны практикующие 2-8, 3-9 и т. Д. И т. Д.

Буду очень признателен за любую помощь, которую вы можете предложить. вот код рельсов, с которыми я работаю.

С наилучшими пожеланиями,

Харрис Новик

# get the default sort order
sort_order = RESOURCE_SORT_ORDER

# if we've been given asset ids, start our list with them
unless params[:asset_ids].blank?
  params[:asset_ids] = params[:asset_ids].values unless params[:asset_ids].is_a?(Array)
  sort_order = "#{params[:asset_ids].collect{|id| "service_provider_resources.id = #{id} DESC"}.join(",")}, #{sort_order}"
end

@asset_set = @provider.active_resources(:include => {:active_services => :latest_approved_version}).paginate(
  :per_page => RESOURCES_IN_DAY_VIEW,
  :page => params[:page],
  :order => sort_order
)

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Хороший вопрос! Я думаю, что это одна вещь, которую 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, таким как вычисление общего количества записей и выбор правильных записей. Я полагаю, вы могли бы создать помощника, если вы собираетесь это делать часто.

0 голосов
/ 08 июня 2010

Я думаю, что LIMIT будет работать для вас. Я не знаю, используя нумерацию страниц, но вы можете попробовать

LIMIT params[:page], 7

Где params [: page] - номер страницы, Таким образом, для страницы 1 будет показано 7 строк из 1, т.е. 1-7 Smilarly, для страницы 2 будет отображаться 7 строк из 2, то есть 2-8

...