如何解决如何使用String#between? DateTime对象在Rails中工作?
使用 Ruby 2.3.2 , Rails 5.0.0.1
在Ruby控制台中
2.3.2 :001 > date_time_str = "2015-01-08 08:17:15 UTC"
=> "2015-01-08 08:17:15 UTC"
2.3.2 :002 > date_time_range_start = "2015-01-08 08:16:15 UTC"
=> "2015-01-08 08:16:15 UTC"
2.3.2 :003 > date_time_range_end = "2015-01-08 08:20:15 UTC"
=> "2015-01-08 08:20:15 UTC"
2.3.2 :008 > require 'date'
=> true
2.3.2 :009 > date_time_str.between?(DateTime.parse(date_time_range_start),DateTime.parse(date_time_range_end))
ArgumentError: comparison of String with DateTime failed
from (irb):9:in `between?'
from (irb):9
from /home/jignesh/.rvm/rubies/ruby-2.3.2/bin/irb:11:in `<main>'
在尝试将String
实例与DateTime
实例进行比较时,我期望上述行为。但是,当我在Rails控制台中尝试相同操作时,它会返回预期结果,如下所示。
在Rails控制台中
Loading development environment (Rails 5.0.0.1)
2.3.2 :001 > date_time_str = "2015-01-08 08:17:15 UTC"
=> "2015-01-08 08:17:15 UTC"
2.3.2 :002 > date_time_range_start = "2015-01-08 08:16:15 UTC"
=> "2015-01-08 08:16:15 UTC"
2.3.2 :003 > date_time_range_end = "2015-01-08 08:20:15 UTC"
=> "2015-01-08 08:20:15 UTC"
2.3.2 :004 > date_time_str.between?(DateTime.parse(date_time_range_start),DateTime.parse(date_time_range_end))
=> true
2.3.2 :005 > date_time_str_2 = "2015-01-08 08:21:15 UTC"
=> "2015-01-08 08:21:15 UTC"
2.3.2 :006 > date_time_str_2.between?(DateTime.parse(date_time_range_end),DateTime.parse(r_e))
=> false
有人可以帮助我了解Rails在内部完成上述工作的原因吗?
解决方法
红宝石中的
String#<=>
尝试将自身与另一个对象进行比较。如果另一个对象是不可比较的(不是字符串),则专门用于字符串的实现(c-source here)会将另一个对象与接收字符串进行比较。
换句话说,"str" <=> obj
等于
if obj.is_a?(String)
# compare bytes
elsif obj.respond_to?(:to_str)
obj = obj.to_str
# compare bytes
else
# a few safety checks
-1 * (obj <=> "str")
end
现在我们有"str" <=> obj
沸腾到obj <=> "str"
。到目前为止,这只是Ruby,没有Rails。由于Datetime#<=>
对字符串没有特殊处理,因此它返回nil并且故事到此结束。
在Rails中,他们重新定义了Datetime#<=>
和定义了String#to_datetime
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。