我们知道高版本中的rails中的分页功能已经放在will_paginate这个gem中,我们在控制器方法中往往需要调用其paginate方法来实现分页数据集控制,举个例子:正常的情况我们想要每页显示10条记录可以这么写:
Item.paginate(page:params[:page],per_page:10)
但是我们又想要降序排列记录呢?书上给出的例子如下:
Item.paginate(page:params[:page],per_page:10,order:'created_at DESC')
可惜该方法在新的rails中已不能使用!通过查看will_paginate的源代码可以看到,原因是如果paginate的调用包含其他参数的话,会调用Active_Record::Relation中的实例方法apply_finder_options:
module Pagination def paginate(options) options = options.dup pagenum = options.fetch(:page) { raise ArgumentError, ":page parameter required" } per_page = options.delete(:per_page) || self.per_page total = options.delete(:total_entries) count_options = options.delete(:count) options.delete(:page) rel = limit(per_page.to_i).page(pagenum) puts "#{'*'*100}:#{rel}\#" rel = rel.apply_finder_options(options) if options.any? rel.wp_count_options = count_options if count_options rel.total_entries = total.to_i unless total.blank? rel end end
可是该方法在新rails中不存在了。解决办法是在控制器调用paginate前排序即可:
@orders = Order.order('created_at DESC').paginate(page:params[:page],per_page:10)