0

使用我的應用程序的軌道 '3.2.20' 時,mysql2 '0.3.20' 和will_paginate '3.0.7'的Rails:will_paginate運行額外的SQL查詢調用page_entries_info

我試圖加載用戶記錄

@users = User.paginate(:page => params[:page], :per_page => 20) 

下面控制檯執行的查詢

User Load (0.3ms) SELECT `users`.* FROM `users` LIMIT 20 OFFSET 0 
(0.3ms) SELECT COUNT(*) FROM `users` 

一般will_paginate運行兩個查詢集合和計數

但我得到一個更額外的查詢鑑於page_entries_info使用

User Load (0.3ms) SELECT `users`.* FROM `users` LIMIT 20 OFFSET 0 
(0.3ms) SELECT COUNT(*) FROM `users` 
User Load (0.2ms) SELECT `users`.* FROM `users` LIMIT 1 OFFSET 0 

希望最後一個查詢是不是在任何地方使用時。

我只是用簡單的例子來說明,但更多的連接和包括我的應用程序執行大量查詢。

,可能與不必要的查詢性能減慢。

這隻will_paginate '3.0.3'

是它的bug /功能後,會出現?如何避免這個額外的查詢?

回答

0

爲了防止will_paginate從產生一算自己的查詢,使用total_entries參數:

@users = User.all 
entries = @users.size 
@users.paginate(:page => params[:page], :per_page => 20, :total_entries => entries) 
0

will_paginate正在因爲軌道懶執行查詢的額外查詢。以下是執行the method

def page_entries_info(collection, options = {}) 
    model = options[:model] 
    model = collection.first.class unless model or collection.empty? # <= this line 
    ... 
end 

如果collection執行該行之前尚未加載,軌,因此對於collection.firstcollection.empty?額外查詢。解決方案是,你通過模型,使will_paginate沒有對其進行評估:

page_entries_info @users, model: 'user'