named_scope条件和时区不匹配

时间:2010-08-13 17:39:32

标签: ruby-on-rails activerecord named-scope

以下是设置:

end_date = DateTime.parse('2010-01-01 12:00:00-04')

有时候它被初始化了:

end_date = 1.days.ago

问题 ...这些named_scope是否会生成相同的 EXACT SQL?

named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date] } 
}

named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date.utc] } 
}

在第一个例子中我使用end_date,在第二个例子中我使用end_date.utc。

(可能需要注意......数据库服务器的操作系统设置为CDT,数据库在内部使用UTC。导轨服务器的操作系统设置为CDT,应用程序实例设置为EDT。我意识到这可能不是配置这些系统的最佳方式,但是,手头的问题是ActiveRecord输出。)

值得我的直觉说第一个例子是为本地TZ生成一个时间字符串,第二个例子将生成一个UTC-0。

PS:我可以使用一个迷你测试案例来验证我的直觉吗?

1 个答案:

答案 0 :(得分:1)

我相信日期将通过调用“.to_s(:db)”进行转换,您可以在IRB控制台会话中看到将返回的内容:

>> DateTime.parse('2010-01-01 12:00:00-04').to_s(:db)
=> "2010-01-01 12:00:00"
>> DateTime.parse('2010-01-01 12:00:00-04').utc.to_s(:db)
=> "2010-01-01 16:00:00"
>> 1.days.ago.to_s(:db)
=> "2010-08-12 18:01:09"
>> 1.days.ago.utc.to_s(:db)
=> "2010-08-12 18:01:13"