String与ActiveSupport :: TimeWithZone的比较失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String与ActiveSupport :: TimeWithZone的比较失败相关的知识,希望对你有一定的参考价值。

我的应用程序为用户提供了创建具有开始和结束时间的事件的机会:

>> Event.where('end_time < ?', 1.days.ago).first
  Event Load (0.3ms)  SELECT  "events".* FROM "events" WHERE (end_time < '2017-12-21 13:30:36.411209') ORDER BY "events"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Event id: 1, user_id: 1, place: "london", start_time: "2017-08-26 20:00", end_time: "2017-08-26 22:00", note: "Note", note_id: 355, picture: "dwarf_hammering.jpg", created_at: "2017-08-14 11:27:16", updated_at: "2017-08-14 11:27:16">

正如您所看到的,start_timeend_time是具有预定义格式的String,Active Record能够将它们与Time实例进行比较。

我创建了一个Sidekiq作业来删除所有超过一天的事件:

class EventsCleanerWorker
  include Sidekiq::Worker

  def perform
    events = Event.where('end_time < ?', 1.days.ago)
    if events.any?
      events.delete_all
    end
  end
end

test/fixtures/events.yml内部,我创造了6个事件:其中两个有一天比一天更长的end_time,如下所示:

event3:
  user: John
  place: "London"
  start_time: 3.days.ago.strftime("%Y-%m-%d %H:%M")
  end_time: 2.days.ago.strftime("%Y-%m-%d %H:%M")
  note: "A thrilling adventure"

然后我创建了以下测试:

def test_events_cleaner_worker_inline_mode
  assert Event.count == 6
  assert events(:event3).end_time < 1.days.ago
  EventsCleanerWorker.perform_async
  assert Event.all.reload.count == 4
  assert_equal 0, EventsCleanerWorker.jobs.size
end

但是,当我运行此测试时,我收到以下错误:

ArgumentError: comparison of String with ActiveSupport::TimeWithZone failed

这个错误被称为assert events(:event3).end_time < 1.days.ago 如果我删除此行,则测试失败,因为测试期望Event.all.reload.count为6而不是4。 我不知道为什么end_time在事件装置中生成的字符串无法与Time进行比较,而这在开发环境中是可能的。

答案

夹具中的start_timeend_time应嵌入ERB,如下所示:

event3:
  user: John
  place: "London"
  start_time: <%= 3.days.ago.strftime("%Y-%m-%d %H:%M") %>
  end_time: <%= 2.days.ago.strftime("%Y-%m-%d %H:%M") %>
  note: "A thrilling adventure"

以上是关于String与ActiveSupport :: TimeWithZone的比较失败的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 ActiveSupport::Concern 模块中由同一模块中的类方法定义的方法

如何使用 NSTimeZone -timeZoneWithName: 与 Rails ActiveSupport 中的城市名称?

Active Merchant - 未初始化的常量 ActiveSupport::XmlMini_REXML::StringIO

类方法上的 ActiveSupport::Callbacks

ActiveSupport::Memoizable 指的是哪种 Ruby memoize 模式?

尝试加载 gem 'devise. ActiveSupport:持续时间不能强制转换为整数