Ruby on rails 命名_范围条件和时区不匹配

Ruby on rails 命名_范围条件和时区不匹配,ruby-on-rails,activerecord,named-scope,Ruby On Rails,Activerecord,Named Scope,以下是设置: end_date = DateTime.parse('2010-01-01 12:00:00-04') 有时它会被初始化: end_date = 1.days.ago 问题。。。这些命名的作用域是否生成相同的SQL named_scope:before,lambda{end_date} {:条件=> [“透支交易付款.创建日期 [“透支交易付款.创建日期

以下是设置:

end_date = DateTime.parse('2010-01-01 12:00:00-04')
有时它会被初始化:

end_date = 1.days.ago
问题。。。这些命名的作用域是否生成相同的SQL

named_scope:before,lambda{end_date}
{:条件=>
[“透支交易付款.创建日期<?”,结束日期]]
}

named_scope:before,lambda{end_date}
{:条件=>
[“透支交易付款.创建日期<?”,结束日期.utc]}
}
在第一个示例中,我使用end_date,在第二个示例中,我使用end_date.utc

(可能需要注意的是……DB服务器的操作系统设置为CDT,DB内部使用UTC。rails服务器的操作系统设置为CDT,应用程序实例设置为EDT。我意识到这可能不是配置这些系统的最佳方式,但是,当前的问题是ActiveRecord输出。)

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


PS:是否有一个小型测试用例可以用来验证我的直觉?

我相信在引擎盖下,日期将通过调用“.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"

从你的例子1看来,“toys(:db)”不会把TZ看作格式化的一部分。当时区如此疯狂时,请确保在SQL中显式使用.to_s(db)。
named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date.utc] } 
}
>> 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"