使用named_scope获取行数

时间:2009-01-04 15:20:48

标签: ruby-on-rails ruby

Rails大师:我刚刚发现named_scope感谢另一位SO用户。 :)

我想得到一组行的计数 - 即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(*)查询。我在查询的数据库中有大量的行。

有更好的方法吗?

3 个答案:

答案 0 :(得分:20)

您正在寻找的功能是内置的。

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

如果您在开发模式下运行script/server,则会在执行时看到查询。

答案 1 :(得分:2)

我认为这根本不正确。范围用于优化查找语句,计数查询不能很好地与这些语句一起使用。

答案 2 :(得分:2)

有一种更好的方法可以做到这一点,rails已经为你提供了手段。

使用您的示例,您可以这样做:

@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"