Rails コンソールでは、次のことを行います。
Video.count
リターン 4
Video.limit(2)
返品 2
v = Video.limit(2)
vv = v.page(1).per(20).count
リターン 4
カミナリlimit
が申請中なのに4/全件表示するのはなぜですか?代わりに 2 を返すべきではありませんか?
Rails コンソールでは、次のことを行います。
Video.count
リターン 4
Video.limit(2)
返品 2
v = Video.limit(2)
vv = v.page(1).per(20).count
リターン 4
カミナリlimit
が申請中なのに4/全件表示するのはなぜですか?代わりに 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
、同じ値を与える必要があります
データベースに 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を参照してください。
これが私の解決策です:
コントローラ:
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 %>