Ruby 如何使用String#between?DateTime对象在Rails中工作吗?

Ruby 如何使用String#between?DateTime对象在Rails中工作吗?,ruby,string,datetime,ruby-on-rails-5,Ruby,String,Datetime,Ruby On Rails 5,使用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 0

使用Ruby 2.3.2Rails 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>'
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
在ruby中尝试将自身与其他对象进行比较。如果另一个对象不可比较(不是字符串),则string的实现()会将另一个对象与接收字符串进行比较

换句话说,
“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
如果对象是?(字符串)
#比较字节
elsif obj.回应?(:回复)
obj=obj.to_str
#比较字节
其他的
#一些安全检查
-1*(obj“str”)
结束
现在我们有了
“str”obj
,可以归结为
obj“str”
。到目前为止,这只是Ruby,没有Rails。由于
Datetime#
对字符串没有特殊处理,因此它返回nil,故事在这里结束

在Rails中,他们在ruby中重新定义和定义了

字符串#
,试图将自己与其他对象进行比较。如果另一个对象不可比较(不是字符串),则string的实现()会将另一个对象与接收字符串进行比较

换句话说,
“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
如果对象是?(字符串)
#比较字节
elsif obj.回应?(:回复)
obj=obj.to_str
#比较字节
其他的
#一些安全检查
-1*(obj“str”)
结束
现在我们有了
“str”obj
,可以归结为
obj“str”
。到目前为止,这只是Ruby,没有Rails。由于
Datetime#
对字符串没有特殊处理,因此它返回nil,故事在这里结束


在Rails中,他们重新定义和定义了

感谢@Siim的引用。我想知道的是
字符串.to_datetime
是如何被自动调用的
between?
是模块提供的方法,我正在字符串上调用该方法。在技术术语中,
接收器
,在
可比
术语中,在我的例子中是一个
字符串
实例,它与另一个
对象
相比较,后者是
日期时间
实例…如果我在
日期时间
实例上调用
之间的
,那么可以理解,它重新定义的
会被调用,并在内部调用
以_DateTime
在要与之比较的
字符串上。如我的帖子所示,Ruby甚至不允许对不同类型进行比较,Rails也允许这样做。我检查了Rails对类的增强行为,但在那些文件中找不到它为
操作符重新定义行为的地方。编辑了答案,解释了
String
如何最终调用
DateTime
。这有帮助吗?我的好奇心到此为止。非常感谢您的帮助。谢谢@Siim的推荐。我想知道的是
字符串.to_datetime
是如何被自动调用的
between?
是模块提供的方法,我正在字符串上调用该方法。在技术术语中,
接收器
,在
可比
术语中,在我的例子中是一个
字符串
实例,它与另一个
对象
相比较,后者是
日期时间
实例…如果我在
日期时间
实例上调用
之间的
,那么可以理解,它重新定义的
会被调用,并在内部调用
以_DateTime
在要与之比较的
字符串上。如我的帖子所示,Ruby甚至不允许对不同类型进行比较,Rails也允许这样做。我检查了Rails对类的增强行为,但在那些文件中找不到它为
操作符重新定义行为的地方。编辑了答案,解释了
String
如何最终调用
DateTime
。这有帮助吗?我的好奇心到此为止。非常感谢你的帮助。