在 Rails 控制台中,我这样做:
Video.count
返回 4
Video.limit(2)
返回 2
v = Video.limit(2)
vv = v.page(1).per(20).count
返回 4
为什么在limit
应用时 Kaminari 显示 4 / all 记录?它不应该返回 2 吗?
在 Rails 控制台中,我这样做:
Video.count
返回 4
Video.limit(2)
返回 2
v = Video.limit(2)
vv = v.page(1).per(20).count
返回 4
为什么在limit
应用时 Kaminari 显示 4 / all 记录?它不应该返回 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]"
不同 DBMS 的 SQL 输出可能不同,但count
应给出相同的值
如果您在数据库中有 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。
这是我的解决方案:
控制器:
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 %>