当我这样做时,来自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
答案 0 :(得分:1)
正如 piyush 所指出的那样,Router.all(:email=>"blake@gmail.com").count
是正确的方法。在调用其中一个“触发器”方法之前,DataMapper不会运行实际查询,例如all
,first
,last
。这允许在调用最终.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}}会有同样的陈述。)