2009-12-01 62 views
0

在我的RoR應用程序,我有一個查詢時可能會返回任何地方0〜1000000結果,說我限制16和用於提供分頁:獲取的分頁查詢結果的總量

find(:all, :conditions => conditions, :limit => limit, :offset => offset) 

我希望能夠告訴用戶他們正在查看多少結果與結果總數。像「顯示16箇中的500個」。在沒有進行非限制性查詢的情況下獲得總行數的最佳方式是什麼?在大型結果集的情況下肯定會很慢?我也想保持數據庫不可知性。

回答

2

它會出現我應該利用谷歌更徹底。 Rails有一個名爲ActiveRecord::Calculations的內置類(去圖)做實用的數據庫計數。我使用這樣的代碼結束:

results = find(:all, :conditions => conditions, :limit => limit, :offset => offset) 
total_count = count(:conditions => conditions) 
return {:results => results, :total_count => total_count} 
results = find(:all, :conditions => conditions, :limit => limit, :offset => offset) 
total_count = count(:conditions => conditions) 
return {:results => results, :total_count => total_count} 
+1

是的,Bloudermilk,你可以使用'count'沒有':limit'選項來獲得它返回的所有行的數量。數據庫過載不是一個問題:他們通常可以非常快地處理COUNT個查詢。只要確保在條件列上有索引,一切都將運行良好。我真的不推薦像存儲過程或觸發器函數這樣的解決方案。程序數據庫直接可以是如此痛苦,並導致如此多的頭痛,你必須有一個真正的理由去做。 – 2009-12-02 01:37:24

0

數據庫無法知道行數匹配查詢,除非它實際執行整個事情。例如,如果您選擇的是MYCOLUMN> 5,那麼它需要在表中的每一行中讀取MYCOLUMN,以知道有多少個值大於5.(儘管您可能能夠通過索引提高效率)。

通常你使用COUNT(*)來描述你所描述的目的。

我能想到的唯一另外一種方式就是在不需要做太多工作的情況下獲得查詢返回的行數,就是在表格上放置一個觸發器函數,在每次插入行時更新計數或者根據它是否與查詢匹配而被刪除。然而,這是嚴格的,因爲它必須針對個別查詢進行定製,而且它當然不是數據庫不可知的方法。