美文网首页
分页Kaminari包的max_per_page配置问题

分页Kaminari包的max_per_page配置问题

作者: slightlove龙 | 来源:发表于2019-07-16 21:46 被阅读0次

问题

今天排查一个导出的问题,只知道之前做了一个导出的优化,分页数量从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

相关文章

网友评论

      本文标题:分页Kaminari包的max_per_page配置问题

      本文链接:https://www.haomeiwen.com/subject/ueyxlctx.html