分頁(yè)Kaminari包的max_per_page配置問(wèn)題

問(wèn)題

今天排查一個(gè)導(dǎo)出的問(wèn)題,只知道之前做了一個(gè)導(dǎo)出的優(yōu)化,分頁(yè)數(shù)量從100上升到了300,但是發(fā)現(xiàn)導(dǎo)出的數(shù)量卻莫名減少了。

排查

之前一直以為是代碼被其他同事動(dòng)過(guò),查了好幾遍,沒(méi)查出來(lái),用了個(gè)暴力的方法,在dev上代碼回退了一下,問(wèn)題就沒(méi)有了;所以確定問(wèn)題肯定是出在這里。

代碼

最終找到了這樣一句代碼:

Users.page(first_page).per(per_page)

之前的per_page是100;后來(lái)把per_page改成了300,就改了這么一個(gè)參數(shù),居然報(bào)錯(cuò)了。

分析

代碼都找到了,那就簡(jiǎn)單了,一看分頁(yè)使用了Kaminari這個(gè)gem,去看了下這個(gè)gem的使用,他有默認(rèn)的max_per_page,我們自己的系統(tǒng)初始化的時(shí)候也做了修改,已經(jīng)修改成了100條。但是當(dāng)我們Users.page(first_page).per(300)時(shí),參數(shù)是300,超過(guò)100了,他只會(huì)按照100的數(shù)量來(lái)計(jì)算。是的,這就報(bào)錯(cuò)了。

看下per這個(gè)方法的源碼吧:

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,當(dāng)前的max_per_page=100 < 300,所以會(huì)執(zhí)行l(wèi)imit(max_per_page).offset(offset_value/ limit_value* max_per_page)

這個(gè)代碼,取的還是100,所以和想要的300條結(jié)果肯定不一致了。

解決

法一:
其實(shí)查看源代碼之后,就很好解決了,在你調(diào)用的時(shí)候只要多加一個(gè)參數(shù)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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容