3

Rails コンソールでは、次のことを行います。

Video.count 

リターン 4

Video.limit(2)

返品 2

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

リターン 4

カミナリlimitが申請中なのに4/全件表示するのはなぜですか?代わりに 2 を返すべきではありませんか?

4

3 に答える 3

2

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 出力は DBMS ごとに異なる場合がありますがcount、同じ値を与える必要があります

于 2011-10-13T08:43:06.760 に答える
2

データベースに 100 のビデオがあり、最初の 50 レコードのみをページ分割したい場合、1 ページあたり 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 %>

最近のバージョンのカミナリ (>= 0.14) では、:num_pagesは: total_pagesに名前が変更されました。詳細については、 https://github.com/errbit/errbit/pull/282およびhttps://github.com/amatsuda/kaminari/issues/284を参照してください

于 2011-11-07T09:39:07.280 に答える
0

これが私の解決策です:

コントローラ:

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 %>
于 2015-01-24T11:46:18.807 に答える