我有很多下列代碼段一個Rails應用程序:在Rails中進行計數的正確方法是什麼?
Our active community of <%= Account.find_all_by_admin(false).count %>
我的問題是,這是要做的看法計數的正確方法?看起來這麼「骯髒」,是否有更多的鐵路呢,重要的方法呢?我正在考慮命名範圍,但我只想確保這些類型的東西不會對性能產生更大的影響。
謝謝你,
我有很多下列代碼段一個Rails應用程序:在Rails中進行計數的正確方法是什麼?
Our active community of <%= Account.find_all_by_admin(false).count %>
我的問題是,這是要做的看法計數的正確方法?看起來這麼「骯髒」,是否有更多的鐵路呢,重要的方法呢?我正在考慮命名範圍,但我只想確保這些類型的東西不會對性能產生更大的影響。
謝謝你,
我建議你避免直接訪問我的模板中的數據庫,因爲那時你在緩存時失去了一些靈活性。
嘗試準備好所有需要在動作中呈現的數據,然後使用有意義的實例變量,如@number_of_accounts
或@accounts.count
。
這會讓你的看法更清潔,更容易調試,也更乾燥一點,如果你渲染不同的格式(HTML,JSON等)
至於你如何讓你的號碼的行動 - 它不」噸真的管那麼多了,剛剛擺脫find_ *方法逐漸遠離作用域和寫可讀的代碼
命名的範圍應該不會對性能
scope :not_admin, where(:admin => false)
然後產生影響,你可以有Account.not_admin.count
每DGM的評論編輯:要檢查在生成的SQL控制檯,比較Account.not_admin.to_sql
與Account.find_all_by_admin(false).to_sql
'Account.not_admin.count.to_sql'是一個錯誤,至少在rails 3中,因爲count返回一個Fixnum。 – DGM 2010-12-14 13:56:53
糟糕。無法在這裏測試,但你必須是正確的。但是,Account.not_admin.to_sql和Account.find_all_by_admin(false).to_sql應該是等效的。 – 2010-12-14 14:46:04
在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')
也看看這篇文章:http://www.railway.at/2010/03/09/named-scopes-are-dead/ – 2010-12-14 13:57:21
+1爲加拿大,呃;-) – Ted 2013-07-02 07:34:17
你不」:
要注意,如果您發出
Contact.find_all_by_country("Canada").count
count
是對數組類的方法,並在數據庫中實際上並沒有發出計數是非常重要的t需要一個名稱範圍來執行計數。
Account.where(:admin => false).count
但命名作用域是使代碼更加可重用的極好方法。
命名作用域對應用程序沒有任何明顯的性能影響。
您可以使用下面的查詢,而不是Account.where(:admin => false).count
Account.select(:id).where(:admin => false).count
只需選擇而不是選擇所有的一列。它生成以下查詢,它比前一個更快:
SELECT COUNT("accounts"."id") FROM "accounts" where admin = false
這是這樣的答案我在尋找,因爲我知道如何去做,我只是想知道做到這一點的最佳方式。 – Gotjosh 2010-12-14 17:51:46