2011-07-22 63 views
0

我正在运行非常奇怪的日期范围查询问题。当我使用DateTime.now.utc选项来查询数据库,为DateTime.now查询日期是不同的,我的现任DateTime.now(这是在控制台上返回即一个。)使用mongoid日期范围查询的奇怪行为。 - Rails 3

我mogoid.yml使用说明 -

use_utc: true 

我有我的命名范围这样的 -

scope :running_auctions, { 
     :where => { :end_time.gt => DateTime.now.utc }, 
     :order_by => [:end_time, "ASC"] 
} 

而且在控制台上我可以做到这一点 -

加载开发环境(滑轨3.0.7)

irb(main):001:0> Auction.running_auctions 
=> #<Mongoid::Criteria 
selector: {:end_time=>{"$gt"=>Fri Jul 22 00:42:38 UTC 2011}}, 
options: {:sort=>[:end_time, "ASC"]}, 
class: Auction, 
embedded: false> 

请注意,我这里日期是星期五07月22日0点42分38秒UTC 2011

irb(main):002:0> DateTime.now 
=> Fri, 22 Jul 2011 11:42:56 +0530 

irb(main):003:0> DateTime.now.utc 
=> Fri, 22 Jul 2011 06:12:59 +0000 

注意这里,我的日期时间是周五,7月22日2011 6时12分59秒+0000

什么使查询日期比实际当前日期更早? mogoid或mongodb在缓存吗? 请让我知道如果我失去了一些东西。

UPDATE

Loading development environment (Rails 3.0.7) 
irb(main):001:0> Auction.running_auctions(DateTime.now.utc) 
=> #<Mongoid::Criteria 
selector: {:end_time=>{"$gt"=>Fri Jul 22 01:21:53 UTC 2011}}, 
options: {:sort=>[:end_time, "ASC"]}, 
class: Auction, 
embedded: false> 

irb(main):002:0> DateTime.now.utc 
=> Fri, 22 Jul 2011 06:52:03 +0000 
+0

你能更新与范围代码和呼叫范围的问题吗? – rubish

回答

1

你必须使用lambda那里。截至目前,DateTime.now.utc是在应用程序启动时计算的,并使用应用程序代码进行缓存。

你需要写为您范围:

scope :running_auctions, lambda { 
    { 
    :where => { :end_time.gt => DateTime.now.utc }, 
    :order_by => [:end_time, "ASC"] 
    } 
} 
+0

非常感谢,你救了我的一天。 – rtdp

+0

我将日期传递给范围,如running_auctions(DateTime.now.utc)并将其缓存为lambda {| date | ..otherstuff ..}哪些为我工作..运行相同的代码没有给当前的日期,但只有旧的日期.. – rtdp

+0

你不需要通过日期。将范围单词写入单词应该有效。 – rubish