rails 3, will_paginate поверх существующего ограниченного результата активной записи - PullRequest
1 голос
/ 20 ноября 2011

У меня большая проблема с разбиением на страницы воли.

У меня есть запрос, определенный как область действия в моей модели:

scope :published_and_valid, joins(...).where(...)

В моем контроллере я иногда просто хочу иметьtop 20.

.limit(20)

Теперь я хочу разбить эти 20 результатов на страницы (5 на страницу)

И я пытаюсь сделать это:

@articles = Article.published_and_valid.limit(20).paginate(:page => params[:page])

Это не работает, так как результат, на мой взгляд, является постраничным результатом для ВСЕХ статей

1 Ответ

7 голосов
/ 21 ноября 2011

Похоже, что will_paginate налагает свое собственное предложение limit на ваши отношения для выполнения подкачки.После некоторых экспериментов самый простой способ, который я смог найти, - это быстро загрузить набор результатов и использовать функциональность, содержащуюся в расширениях массива , для фактической нумерации страниц.

Вот быстрый пример;обратите внимание, что вы должны потребовать will_paginate/array;Вы можете сделать это в инициализаторе или в другом месте.Обратите внимание, что для получения метода paginate используется monkey-patch Array.

require 'will_paginate/array'

class ArticlesController < ApplicationController
  def index
    @articles = Article.published.limit(20).all # call `all` to eager load
    @articles = @articles.paginate(:page => params[:page], :per_page => 10)
  end
end

[Обновить]

Другой вариант - передать total_entires опция will_paginate в зависимости от размера набора результатов.

class ArticlesController < ApplicationController
  def index
    @articles = Article.published.limit(20)
    @articles = @articles.paginate(:page => params[:page], :per_page => 10, :total_entries => @articles.count)
  end
end

Вы не можете передать 20, поскольку не можете гарантировать, что будут возвращены полные 20 результатов;передав атрибут count, вы можете убедиться в правильности нумерации страниц.

...