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

时间:2018-04-23 02:44:09

标签: ruby-on-rails will-paginate

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

控制器

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

假设我只收到1或2个结果,我仍然会得到两页的分页。即,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

我见过有人使用连接模型的问题并且会分页,但我只是使用简单的单一模型paginate。搜索了很多关于这个。根据我的知识,paginate将传递total_pages方法来查看和呈现此结果。有没有办法为我的结果设置限制?

1 个答案:

答案 0 :(得分:2)

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分开的结果不准确),或者甚至可能要求更高的页码和仍然得到“隐藏”的结果。

如果你真的需要避免在某个数字上显示结果,你将被迫使用这样的子查询:

@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会覆盖此逻辑。