2009-01-04 52 views
12

Rails大師:我剛剛發現named_scope感謝另一個SO用戶。 :)使用named_scope獲取行數

我想獲得一組行的數量 - 即一個SELECT COUNT(*)。另外,我想仍然可以在調用中鏈接命名範圍。

這是命名作用域的合法(雖然很奇怪)用法嗎?

named_scope :count, :select => "COUNT(*) as count_all" 

於是我可以(例如)做:

@foobar = Foobar.count.scope.scope.scope 

計數通過@foobar.first.count_all訪問。

(編輯解決艾倫的評論)

你可以這樣做:

@foobar = Foobar.scope.scope.scope.size 

但是,這會導致結果的查詢,而不是更快的SELECT COUNT(*)查詢。我在查詢的數據庫中有大量的行。

有沒有更好的方法來做到這一點?

回答

20

你要找的是一幢建於功能

Foobar.count # SELECT count(*) AS count_all FROM "foobars" 
Foobar.named_scope.count # SELECT count(*) AS count_all FROM "foobars" WHERE .... 

如果您在開發模式下運行script/server,則會在查詢執行時看到這些查詢。

2

我不認爲這是正確的。範圍用於細化查找語句,並且計數查詢不能很好地與這些語句配合使用。

2

有一個更好的方法來做到這一點,鋼軌已經給你的手段。

使用你的榜樣,你可能只是這樣做:

@foobar_size = Foobar.all.size #returns integer equal to total rows of Foobar 

,甚至範圍它像這樣:

@banned_foobars = Foobar.scope_to_find_banned.size #returns integer equal to total rows for "scope_to_find_banned" 
+0

這是我最初嘗試過的。 問題在於它沒有利用SELECT COUNT(*)是一個相對較快的查詢的事實。它會做一個行查詢,並且慢得多。 – unknownuser 2009-01-04 17:07:32

+0

啊!我明白你的意思了。 請原諒我的誤解。 – 2009-01-05 12:28:05