" Date与ActiveSupport的比较:: TimeWithZone"在生产中约两个月后始终失败

时间:2017-08-04 15:45:05

标签: ruby-on-rails ruby date ruby-on-rails-4

在生产应用程序中,以下代码在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更改为日期...但是如果有人能够解释发生的事情会很棒。

版本

版本:

  • rbx 2.5.2,这是ruby 2.1.0
  • rails 4.2.3
  • Linux版本4.9.15-x86_64-linode81(maker @ build)(gcc版本4.7.2(Debian 4.7.2-5))

参考

Don't use Date == TimeWithZone,这是有道理的。

Date.today > Time.now fails in some situations - 有趣的是,我可以在irb中重现它们的错误,但不能在Rails控制台中重现它们。我假设Rails正在做些什么来解决这个问题?可能是相关的,但由于我无法在控制台中重现它,我不知道该怎么做。

0 个答案:

没有答案