2016-11-02 2 views
2

RubyのRange.....演算子をオーバーライドしたいと考えています。Ruby Rangesの..と...演算子をオーバーライドして、Float :: INFINITYを受け入れることができますか?

理由は、私はデータベース内の無限の日付範囲で作業しています。あなたがinfinty datetimeをPostgresから引き出すと、Rubyには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 

...まだ私は私のコードでかなり頻繁に.....の構文を使用します。

これに伴う問題は、私は範囲の終わりとしてFloat::INFINITYを使用することはできません。

にも範囲を構築することができるようにするには、あなたの代わりに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)

.....演算子をオーバーライドして、変換関数を組み込んで構文を保持できる方法はありますかシュガー?

+0

私はこれを発見しました:https://bugs.ruby-lang.org/issues/6864。それが決心されたかどうかは分かりません。 –

+1

あなたはどのバージョンのRailsを使用していますか? 'DateTime.now ... Float :: INFINITY'はRails 5.0.0.1で正常に動作します。 –

+0

ああ、 '4.2.5' – fatuhoku

答えて

3

私はあなたがしたいことは、そのような問題を解決する正しい方法だとは思わない。私が代わりにお勧めします何

は、単にモデルでend_dateメソッドをオーバーライドすることです:

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

この基本的にはデシベルでend_dateは、そうでない場合は、データベースに何があるかを返す、end_dateとしてDateTime::Infinity.newを返すFloat::INFINITYであれば言います。

+0

これは本当に良いアイデアです...私は今それを打つつもりです。 – fatuhoku

+0

@fatuhokuさて、それがうまくいけば教えてください。また、 'DateTime.now ... Float :: INFINITY'があなたのために動作しないという奇妙な集会です。 –

+0

これは良い解決策だと思います。 – fatuhoku

関連する問題