问题
今天排查一个导出的问题,只知道之前做了一个导出的优化,分页数量从100上升到了300,但是发现导出的数量却莫名减少了。
排查
之前一直以为是代码被其他同事动过,查了好几遍,没查出来,用了个暴力的方法,在dev上代码回退了一下,问题就没有了;所以确定问题肯定是出在这里。
代码
最终找到了这样一句代码:
Users.page(first_page).per(per_page)
之前的per_page是100;后来把per_page改成了300,就改了这么一个参数,居然报错了。
分析
代码都找到了,那就简单了,一看分页使用了Kaminari这个gem,去看了下这个gem的使用,他有默认的max_per_page,我们自己的系统初始化的时候也做了修改,已经修改成了100条。但是当我们Users.page(first_page).per(300)时,参数是300,超过100了,他只会按照100的数量来计算。是的,这就报错了。
看下per这个方法的源码吧:
def per(num, max_per_page:nil)
max_per_page ||= ((defined?(@_max_per_page)&&
@_max_per_page)|| self.max_per_page)
@_per = (num || default_per_page).to_i
if (n = num.to_i)< 0 || !(/^\d/ =~ num.to_s)
self
elsif n.zero?
limit(n)
elsif max_per_page && (max_per_page < n)
limit(max_per_page).offset(offset_value/ limit_value* max_per_page)
else
limit(n).offset(offset_value/ limit_value* n)
end
end
很明显,只传per_page=300,当前的max_per_page=100 < 300,所以会执行limit(max_per_page).offset(offset_value/ limit_value* max_per_page)
这个代码,取的还是100,所以和想要的300条结果肯定不一致了。
解决
法一:
其实查看源代码之后,就很好解决了,在你调用的时候只要多加一个参数max_per_page:300就可以了。
Users.page(first_page).per(300,max_per_page:300)
法二(可以全局配置):
Kaminari.configure do |config|
config.default_per_page = 15
config.max_per_page = 100
end
github链接:https://github.com/kaminari/kaminari
网友评论