如何覆盖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_date
是Float::INFINITY
返回DateTime::Infinity.new
作为end_date
,否则返回数据库中的内容。