Ruby Datamapper计数不起作用

时间:2013-01-18 05:36:10

标签: ruby sinatra ruby-datamapper

当我这样做时,来自irb:

Router.all(:email=>"blake@gmail.com")

我获得了与该电子邮件关联的所有路由器的列表。但是当我这样做时:

Router.count(:email=>"blake@gmail.com")

我总是0

我也看过这个问题:Ruby Datamapper .count always returns 0但我仍然不知道为什么它不起作用。

- 更新#1 -

这是Router.all命令的输出。如你所见,我得到了结果。

1.9.3-p362 :003 > Router.all(:email=>"blake@gmail.com")
=> [#<Router @id=8 @email="blake@gmail.com" @hostname="router0">, #<Router @id=9              @email="blake@gmail.com" @hostname="router0">, #<Router @id=10 @email="blake@gmail.com" @hostname="router0">, #<Router @id=11 @email="blake@gmail.com" @hostname="router0">, #<Router @id=13 @email="blake@gmail.com" @hostname="router0">, #<Router @id=14 @email="blake@gmail.com" @hostname="router0">, #<Router @id=15 @email="blake@gmail.com" @hostname="router0">, #<Router @id=16 @email="blake@gmail.com" @hostname="router0">] 

但是当我按照建议执行Router.count时它仍然返回0

1.9.3-p362 :004 > Router.count(:conditions => ["email = ?", "blake@gmail.com"])
=> 0 

1.9.3-p362 :005 > Router.count(:conditions => "email = 'blake@gmail.com'")
=> 0 

2 个答案:

答案 0 :(得分:1)

正如 piyush 所指出的那样,Router.all(:email=>"blake@gmail.com").count是正确的方法。在调用其中一个“触发器”方法之前,DataMapper不会运行实际查询,例如allfirstlast。这允许在调用最终.all之前链接多个方法以运行复合查询。

Router.count(:email=>"blake@gmail.com")的情况下,您正在对“空”DataMapper对象运行计数,该对象已初始化但其查询尚未运行。

答案 1 :(得分:1)

您可以require 'dm-aggregates',之后可以

Router.count(:email => "blake@gmail.com")

它会变成

SELECT COUNT(*) FROM routers WHERE "email" = 'blake@gmail.com'

(尽管Router.all(:email => "blake@gmail.com").count dm-aggregates与{{1}}会有同样的陈述。)