3

在 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 吗?

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]"

不同 DBMS 的 SQL 输出可能不同,但count应给出相同的值

于 2011-10-13T08:43:06.760 回答
2

如果您在数据库中有 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/282https://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 回答