我想重写ruby的..
中的...
和Range
操作符。
原因是,我正在处理数据库中的无限日期范围。如果您从postgres中提取一个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...#<Date::Infinity:0x007fd82348c698 @d=1>
DateTime.now...DateTime::Infinity.new
=> Wed, 02 Nov 2016 12:57:07 +0000...#<Date::Infinity:0x007fd82348c698 @d=1>
Time.now...DateTime::Infinity.new
=> 2016-11-02 12:57:33 +0000...#<Date::Infinity:0x007fd82348c698 @d=1>
但我每次都需要进行
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
这基本上是说如果数据库中的
end_date
是Float::INFINITY
返回DateTime::Infinity.new
为end_date
,否则返回数据库中的内容。关于ruby-on-rails - 如何覆盖Ruby Ranges的..和…运算符以接受Float::INFINITY?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40380603/