Почему Kaminari отображает 4 / все записи, когда применяется «лимит»? - PullRequest
3 голосов
/ 13 октября 2011

В консоли Rails я делаю:

Video.count 

Возвращает 4

Video.limit(2)

Возвращает 2

v   = Video.limit(2)
vv = v.page(1).per(20).count

Возвращает 4

Почему Kaminari отображает 4 / все записи, когда применяется limit? Разве он не должен возвращать 2 вместо этого?

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Если у вас есть 100 видео в БД, и вы хотите разбить на страницы только первые 50 записей, скажем, 25 на страницу - в качестве идеи вы можете ограничить количество страниц в представлении.

# videos_controller.rb
def index
  @videos = Video.page(params[:page]).per(25)
end

# index.html.erb
<%= paginate @videos, :num_pages => 2 %>

# index.html.erb using Kaminari 0.14 or higher
<%= paginate @videos, :total_pages => 2 %>

В последних версиях Kaminari (> = 0,14) : num_pages было переименовано в : total_pages . Для получения дополнительной информации, пожалуйста, обратитесь к https://github.com/errbit/errbit/pull/282 и https://github.com/amatsuda/kaminari/issues/284.

2 голосов
/ 13 октября 2011

Если вы проверите исходный код для метода per, вы увидите

  # Specify the <tt>per_page</tt> value for the preceding <tt>page</tt> scope
  #   Model.page(3).per(10)
  def per(num)
    if (n = num.to_i) <= 0
      self
    else
      limit(n).offset(offset_value / limit_value * n)
    end
  end

, поэтому ваш код будет похож на

Video.limit(2).limit(20).count

, что дает

irb(main):002:0* Video.count
=> 4
irb(main):003:0> Video.limit(2).count
=> 2
irb(main):004:0> Video.limit(2).limit(4).count
=> 4
irb(main):005:0> Video.limit(4).limit(10).to_sql 
=> "SELECT TOP (10) [Video].* FROM [Video]"

Вывод SQL может отличаться для разных СУБД, но count должен давать одинаковые значения

0 голосов
/ 24 января 2015

Это мое решение:

Контроллер:

class Frontend::FirmsController < Frontend::BaseController
  helper_method :max_pages

  def search_with_city
    city = City.find_by_symbol_name(params[:symbol_name])
    raise ActiveRecord::RecordNotFound if city.nil?
    @firms = Firm.in_city(city.id).page(current_page).per(20)
    render 'index'
  end

  def max_pages
    5
  end

  private

  def current_page
    [(params[:page] || 1).to_i, max_pages].min
  end
end

Просмотр:

<%= paginate @firms, total_pages: [@firms.total_pages, max_pages].min %>
...