2010-12-14 60 views
5

我有很多下列代碼段一個Rails應用程序:在Rails中進行計數的正確方法是什麼?

Our active community of <%= Account.find_all_by_admin(false).count %> 

我的問題是,這是要做的看法計數的正確方法?看起來這麼「骯髒」,是否有更多的鐵路呢,重要的方法呢?我正在考慮命名範圍,但我只想確保這些類型的東西不會對性能產生更大的影響。

謝謝你,

回答

6

我建議你避免直接訪問我的模板中的數據庫,因爲那時你在緩存時失去了一些靈活性。

嘗試準備好所有需要在動作中呈現的數據,然後使用有意義的實例變量,如@number_of_accounts@accounts.count

這會讓你的看法更清潔,更容易調試,也更乾燥一點,如果你渲染不同的格式(HTML,JSON等)

至於你如何讓你的號碼的行動 - 它不」噸真的管那麼多了,剛剛擺脫find_ *方法逐漸遠離作用域和寫可讀的代碼

+0

這是這樣的答案我在尋找,因爲我知道如何去做,我只是想知道做到這一點的最佳方式。 – Gotjosh 2010-12-14 17:51:46

2

命名的範圍應該不會對性能

scope :not_admin, where(:admin => false) 

然後產生影響,你可以有Account.not_admin.count

每DGM的評論編輯:要檢查在生成的SQL控制檯,比較Account.not_admin.to_sqlAccount.find_all_by_admin(false).to_sql

+0

'Account.not_admin.count.to_sql'是一個錯誤,至少在rails 3中,因爲count返回一個Fixnum。 – DGM 2010-12-14 13:56:53

+0

糟糕。無法在這裏測試,但你必須是正確的。但是,Account.not_admin.to_sql和Account.find_all_by_admin(false).to_sql應該是等效的。 – 2010-12-14 14:46:04

1

在rails 3中,一個簡單的調用來計算一個簡單的co UNT要求:

Contact.count 

被解析爲:

SELECT COUNT(*) AS count_id FROM "contacts" 

一個找到所有字段的名稱會解析:

Contact.find_all_by_country("Canada") 

SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada') 

我會建議索引你的管理員列更快的查找速度,這可以被翻譯成命名的範圍,但它本身只會預定義查詢,而不是優化它。

Contact.find_all_by_country("Canada").count 

SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada') 
+0

也看看這篇文章:http://www.railway.at/2010/03/09/named-scopes-are-dead/ – 2010-12-14 13:57:21

+0

+1爲加拿大,呃;-) – Ted 2013-07-02 07:34:17

7

你不」:

要注意,如果您發出

Contact.find_all_by_country("Canada").count 

count是對數組類的方法,並在數據庫中實際上並沒有發出計數是非常重要的t需要一個名稱範圍來執行計數。

Account.where(:admin => false).count 

但命名作用域是使代碼更加可重用的極好方法。

命名作用域對應用程序沒有任何明顯的性能影響。

0

您可以使用下面的查詢,而不是Account.where(:admin => false).count

Account.select(:id).where(:admin => false).count 

只需選擇而不是選擇所有的一列。它生成以下查詢,它比前一個更快:

SELECT COUNT("accounts"."id") FROM "accounts" where admin = false 
相關問題