无法获取将分页 total_entries 工作,rails

Cannot get will paginate total_entries to work, rails

问题是我想将结果数限制为 30,所以我输入了

控制器

@users = User.user_search(params[:name], params[:gender]).paginate(page: params[:page], per_page: 20, total_entries: 30)
  render 'user_results' 

假设我只得到 1 或 2 个结果,我仍然会得到两页的分页。 ie will paginate 似乎得到 total_entries 将分成 per_page 值多少次的结果。因此,如果我设置 per_page: 20, total_entries: 110,它将给我六个链接,并将额外的 10 个链接也添加为一个页面。

我在用户模型中的User.user_search方法是

def self.user_search(a, b)
  users = User.all
  users = User.where('LOWER (name) LIKE LOWER(?)', "%#{a}%") if a.present?
  users = users.where('LOWER (gender) LIKE LOWER(?)', "%#{b}%") if b.present?
  return users
end

我看到有人在使用连接模型时遇到问题并且会分页,但我只是使用简单的单一模型分页。搜索了很多关于这个。据我所知,分页将传递 total_pages 方法来查看和呈现此结果。有什么方法可以限制我的结果吗?

total_entries 选项只是避免 will_paginate 查询结果计数的快捷方式。因此,如果您真的想限制分页显示的结果数量,但又不想在只有少数结果时弄乱分页结果,您可以这样做:

total_records = User.user_search(params[:name], params[:gender]).count
total_entries = total_records > 30 ? 30 : total_records
@users = User.user_search(params[:name], params[:gender]).paginate(page: params[:page], per_page: 20, total_entries: total_entries)
render 'user_results'

您可能认为这会添加一个额外的查询,但 will_paginate 仍将执行 count 查询以执行其逻辑,这里我们只是覆盖了 total_entries 通过设置要显示的最大记录数。

但是请注意,通过这样做,您仍然会在最后一页中获得更多记录(如果在页面之间划分 total_records 的结果不准确),或者甚至可以询问对于更高的页码,仍然得到 'hidden' 结果。

如果你真的需要避免显示超过一定数量的结果,你将被迫使用这样的子查询:

@users = User.where(id: User.user_search(params[:name], params[:gender]).limit(30).map(&:id)).paginate(page: params[:page], per_page: 20)

但是,如果您使用一个非常大的数字而不是 30,这可能会导致问题。


之前我建议在搜索结果中使用 ActiveRecord::QueryMethods.limit,但 will_paginate 在分页时会覆盖此逻辑。