rails 3, will_paginate поверх существующего ограниченного результата активной записи
У меня большая проблема с волеизъявлением.
У меня есть запрос, определенный как область в моей модели:
scope :published_and_valid, joins(...).where(...)
В моем контроллере я иногда просто хочу иметь 20 лучших.
.limit(20)
Теперь я хочу разбить эти 20 результатов на страницы (5 на страницу)
И я пытаюсь сделать это:
@articles = Article.published_and_valid.limit(20).paginate(:page => params[:page])
Это не работает, так как результат, на мой взгляд, является постраничным результатом для всех статей
1 ответ
Похоже, will_paginate навязывает свой limit
пункт о вашем отношении для того, чтобы сделать пейджинг. После некоторых экспериментов самый простой способ, который я смог найти, - это быстро загрузить набор результатов и использовать функциональность, содержащуюся в расширениях массива, для фактической нумерации страниц.
Вот быстрый пример; обратите внимание, что вы должны требовать will_paginate/array
; Вы можете сделать это в инициализаторе или в другом месте. Обратите внимание, что это делает обезьяна-патч Array
иметь paginate
метод.
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
атрибут, вы можете убедиться, что нумерация страниц будет правильной.