問(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