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 атрибут, вы можете убедиться, что нумерация страниц будет правильной.

Другие вопросы по тегам