2014-02-11 15 views
0

試圖做一個簡單的Model.all.page(1)
但是每當調用.page時,它都會創建一個SQL COUNT調用。 (我的實際代碼比上面更復雜,但是爲了便於閱讀而進行了簡化。)有沒有辦法阻止.page調用SQL計數?我正在處理數以百萬計的產品,並且此調用正在使頁面刷新需要額外2秒的時間才能加載。我已經有了自己的自定義計數,因此我不需要這個.page計數。Rails模型上的頁面調用也調用計數

編輯:Def不使用.all。不好的例子抱歉。

繼承人一個非常簡單的例子,基本上是我簡而言之代碼: Product.limit(1).page(1)

用我的實際代碼SQL生成:(1495.3ms) SELECT COUNT(*) FROM 'products' LEFT OUTER JOIN...

我加入的產品表,我並不需要是計數,因此,我有我自己的計數方法,我想要使用,並不需要.page來產生它自己的計數。

+0

您可以在選項通過像這樣?通常你會使用'paginate'方法。如果你有另一種方法,你可以使用':total_entries'選項來傳遞它。 'Model.paginate(:page => 1,:total_entries => 50)' –

+0

很確定COUNT查詢不是由您認爲是的語句生成的。雖然它與分頁有關,但它可能是另一種說法。一些試圖找出總頁數來爲您創建分頁的東西。你有沒有100%跟蹤整個問題到#page call?如果是的話那麼如何? –

+0

@HeliosdeGuerra,我可以同時做兩個.paginate並傳入選項或.page和.per_page。兩者都給出我需要的分頁結果,但是兩者都會導致COUNT查詢 TanelSuurhans當我執行Product或User或其他任何Model.limit(1).page(1)並且它100%插入SQL COUNT調用時,I會說這是跟蹤。我不知道任何其他方式來追蹤它。如果我使用Model.page(1),它仍然返回SQL計數以及查詢信息,但會遍歷所有產品(顯然我在調試時避免這種情況) –

回答

2

當您撥打Model.all.page(1)時,您將獲得一個數組而不是ActiveRecord關係。

嘗試只是打電話Model.page(1),你應該得到你想要的東西......如果你想要的是:

Model.page(1) 

# results in SELECT "models".* FROM "models" LIMIT 30 OFFSET 0 

編輯: 所以這個問題最終在will_paginate gem是是因爲它在呼喚依靠查詢來知道條目的總數,以便它可以獲得精確的頁數。但是,will_paginate確實爲paginate方法提供了一個選項,該方法允許您傳入自定義total_entries計數,如果您擁有大量表並且不在意爲每個與查詢匹配的記錄獲取精確的頁數,那麼這將非常有用。你爲什麼要直接使用`page`方法

Model.paginate(:page => params[:page], :per_page => 30, :total_entries => 100) 
+0

我的數據庫有幾百萬個產品,所以我必須添加.limit(1)進行測試。因此,當我做Product.limit(1).page(1)(基本上與您的代碼相同)時,它給出了一個SQL計數: '(57.6ms)SELECT COUNT(*)FROM'products'' '不需要/需要 –

+0

嗯,我認爲你的'頁面'方法來自分頁寶石?例如will_paginate或kaminari? –

+0

是的,我使用gem'bootstrap-will_paginate',它需要基本的'will_paginate'gem。 –

1

您很關心COUNT查詢,但是您正在通過Model.all從數據庫中選擇所有記錄?你現在在開玩笑嗎? 您還需要提供代碼才能獲得幫助。我們無法閱讀您的想法,我們無法編寫您可能擁有的代碼。特別是當你說「我的實際代碼比上面更復雜」時。不要試圖簡化問題或隱藏你認爲不相關的代碼。

你的代碼是什麼樣的?你的日誌是什麼樣的,特別是查詢時間和總頁面時間(渲染和ActiveRecord拆分)。你需要提供更多信息。

+0

我已更新該問題。該更新包含儘可能多的代碼,因爲它是專有的,所以不能發佈代碼。但以上內容基本相同。我只是不想要.page來調用sql計數 –

+0

如果是Rails 4,它不會選擇所有記錄。 –

相關問題