2012-06-01 33 views
1

我有一個Rails ActiveRecord查詢,可以查找名稱是某個標記的所有記錄。第二次獲取一個Rails記錄計數

records = Market.where("lower(name) = ?", name.downcase); 
rec = records.first; 
count = records.count; 

服務器顯示爲.first.count來電均命中數據庫。

←[1m←[35mCACHE (0.0ms)←[0m SELECT "markets".* FROM "markets" WHERE (lower(nam 
e) = 'my market') LIMIT 1 

←[1m←[36mCACHE (0.0ms)←[0m ←[1mSELECT COUNT(*) FROM "markets" WHERE (lower(na 
me) = 'my market')←[0m 

爲什麼在數據庫可以使用已經查詢的結果時獲取計數?

我很關心未來的表現。今天有1000條記錄。當該表擁有800萬行時,對數據執行兩個查詢,並對count進行一個查詢,這將是昂貴的。

如何從集合中獲取計數,而不是數據庫?

回答

8

RactiveRecord使用延遲查詢從數據庫中獲取數據。如果您想對記錄進行簡單計數,則只能調用反演數組的大小。

records = Market.where("lower(name) = ?", name.downcase).all 
records.size 
+0

正確。更多的說明 - > http://rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length –

+0

更新Rails 5.更改records.count records.size仍然導致額外的數據庫查詢。但將其更改爲records.length沒有,所以請嘗試records.length。在最後加入.all並沒有對查詢結果產生任何影響。 –

+0

t.length也導致數據庫查詢(我使用Rails 5) – Kaz

6

因此,recordsActiveRelation。您可能會認爲這是您的所有市場記錄的數組,符合您的where條件,但事實並非如此。每次您在該關係上引用類似firstcount的東西時,它都會執行查詢來檢索您要求的內容。

要將實際記錄放入數組中,只需將.all添加到實際檢索它們的關係中即可。像:

records = Market.where("lower(name) = ?", name.downcase).all 
count = records.count