Rails中will_paginate的total_entries参数无法正常工作问题
解决will_paginate中total_entries导致分页链接异常的问题
你遇到的这个问题其实是will_paginate的设计逻辑导致的——当你手动指定total_entries参数时,它会直接用这个数值来计算总页数,完全忽略实际查询返回的记录数量。所以哪怕实际结果只有1-2条,只要你设置了total_entries:30和per_page:20,它就会按30 ÷ 20的结果向上取整得到2页,自然就会显示两页的分页链接。
这里给你两个可行的解决方案,按需选择:
方案一:先限制结果总数,再分页(推荐)
先通过limit(30)把查询结果限制在最多30条,再对这部分结果进行分页。这样will_paginate会自动基于实际的结果总数计算页数,不会出现多余的分页链接:
# 先获取最多30条符合搜索条件的记录 search_results = User.user_search(params[:name], params[:gender]).limit(30) # 对这30条记录进行分页 @users = search_results.paginate(page: params[:page], per_page: 20)
这个方案更高效,因为limit(30)会减少数据库返回的数据量,避免不必要的数据传输。
方案二:动态计算total_entries
如果你因为某些特殊场景必须保留total_entries的使用,可以先查询实际的记录总数,取它和30的最小值再传给total_entries:
# 获取实际符合条件的记录总数 actual_total = User.user_search(params[:name], params[:gender]).count # 取实际总数和30的较小值作为total_entries limited_total = [actual_total, 30].min # 执行分页查询 @users = User.user_search(params[:name], params[:gender]).paginate(page: params[:page], per_page: 20, total_entries: limited_total)
这样如果实际结果只有2条,limited_total就是2,will_paginate会计算出1页;如果实际结果超过30条,就按30条来计算页数,符合你限制结果总数的需求。不过这个方案需要额外执行一次count查询,性能略逊于第一种。
内容的提问来源于stack exchange,提问作者Lee Eather
相关产品推荐
相关产品推荐

