在生产应用程序中,以下代码在dev和(最初)生产中工作:
@employee.ident_expiration_date && @employee.ident_expiration_date < 3.months.from_now
该应用程序每天由一个或多个用户使用。在任意间隔,至少一周最多3个月,此错误开始发生:ActionView::Template::Error (comparison of Date with ActiveSupport::TimeWithZone)
在控制台中:
>> date = e.ident_expiration_date
=> Sat, 12 Jun 2021
>> date.class
=> Date
>> twz = 3.months.from_now
=> Sat, 04 Nov 2017 10:11:54 CDT -05:00
>> twz.class
=> ActiveSupport::TimeWithZone
>> date < twz
=> false
我想也许我需要的东西可能导致这个问题...但是整个/ app目录中唯一的require语句是require 'valuable'
,我写的一个宝石。我确定不会导致这个问题。
自上次重新启动应用程序以来,此过程一直处于活动状态(导致问题消失。)
product+ 3053 0.0 16.7 1981264 342088 ? Sl Jun16 50:32 puma 2.12.3 (tcp://0.0.0.0:9444) [20170323153916]
所以我在这一点上的结论是,其中一个类被一些不经常运行的代码所污染。我已经浏览了该应用程序的近期历史,以迫使其发生。但我还没有成功。
我对任何关于如何发生这种情况的想法持开放态度。
基于下面的第二个参考,我的远程回答是使用@employee.ident_expiration_date && @employee.ident_expiration_date < 3.months.from_now.to_date
将TimeWithZone更改为日期...但是如果有人能够解释发生的事情会很棒。
版本:
Don't use Date == TimeWithZone,这是有道理的。
Date.today > Time.now fails in some situations - 有趣的是,我可以在irb中重现它们的错误,但不能在Rails控制台中重现它们。我假设Rails正在做些什么来解决这个问题?可能是相关的,但由于我无法在控制台中重现它,我不知道该怎么做。