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_time
和end_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_time
和end_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