String与ActiveSupport :: TimeWithZone的比较失败

问题描述 投票:0回答:1

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

>> 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进行比较,而这在开发环境中是可能的。

ruby-on-rails datetime activerecord minitest fixtures
1个回答
0
投票

夹具中的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"
© www.soinside.com 2019 - 2024. All rights reserved.