美文网首页
分页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