3

当我这样做时,来自 irb:

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

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

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

我总是得到 0

我也看过这个问题:Ruby Datamapper .count always return 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 
4

2 回答 2

1

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

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

于 2013-03-29T08:42:45.640 回答
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").countwith相同的声明dm-aggregates。)

于 2013-03-29T10:10:09.693 回答