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(*)
查询。我在查询的数据库中有大量的行。
有更好的方法吗?
答案 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"