如何覆盖Ruby Ranges的..和…运算符以接受Float :: INFINITY?

我想覆盖Ruby的Range.....运算符。

原因是,我正在使用数据库中的无限日期范围。 如果你从Postgres中infinty一个infinty日期时间,你会在Ruby中得到一个Float::INFINITY

这个问题是,我不能使用Float::INFINITY作为范围的结尾:

 Date.today...Float::INFINITY => Wed, 02 Nov 2016...Infinity DateTime.now...Float::INFINITY # ArgumentError: bad value for range Time.now...Float::INFINITY # ArgumentError: bad value for range 

…但我在代码中经常使用.....语法。

为了能够构造范围,您需要使用DateTime::Infinity.new

 Date.today...DateTime::Infinity.new => Wed, 02 Nov 2016...# DateTime.now...DateTime::Infinity.new => Wed, 02 Nov 2016 12:57:07 +0000...# Time.now...DateTime::Infinity.new => 2016-11-02 12:57:33 +0000...# 

但我每次都需要进行Float::INFINITY – > DateTime::Infinity.new转换:

model.start_time...convert_infinity(model.end_time)

有没有办法可以覆盖.....运算符,以便我可以合并转换函数并保持语法糖?

我不认为你想做的是解决这个问题的正确方法。

我建议的是简单地覆盖模型中的end_date方法:

 def end_date super == Float::INFINITY ? DateTime::Infinity.new : super end 

这基本上说如果db中的end_dateFloat::INFINITY返回DateTime::Infinity.new作为end_date ,否则返回数据库中的内容。