问题是我想将结果数限制为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方法来查看和呈现此结果。有没有办法为我的结果设置限制?
答案 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会覆盖此逻辑。