私は Rails アプリでデュレーションをかなり扱っているので、いくつかの場所でデュレーションをハッシュ キーとして使用したいと考えています。ただし、期待どおりに機能していないようです。
初期ハッシュの作成は正常に機能します。たとえば、次のように動作します。
>> hash = {1.week => 'abc', 1.month => 'def'}
ただし、ハッシュから値を取得することはできません。
>> hash[1.month]
=> nil
さらに調査したところ、この理由がわかりました。
>> 1.week.eql? 1.week
=> false
これはかなり予想外でした
さらに、これらのオブジェクトは FixNum クラスの通常のオブジェクトとは動作が異なるようです。通常の FixNum オブジェクトの場合、object_id の値は常に同じように見えます。例:
>> 15.object_id
=> 31
>> 15.object_id
=> 31
デュレーションの場合、同じクラスですが、これは異なります
>> 1.month.class
=> Fixnum
>> 1.month.object_id
=> 70305513092140
>> 1.month.object_id
=> 70305513086860
そのため、オブジェクトが常に異なるように見えるため、ハッシュが機能しません。唯一の解決策は、まったく同じオブジェクトでアクセスすることです。
>> a = 1.month
=> 1 month
>> hash = {a => 'b'}
=> {1 month=>"b"}
>> hash[a]
=> "b"
明らかに、動的に作成された継続時間を持つオブジェクトが多数ある場合、これが常に可能であるとは限りません。
期間によるグループ化も機能しません。
>> limits.group_by(&:duration)
=> #<OrderedHash {1 month=>[#<Limit:0x7fe28e441380>], 1 month=>[#<Limit:0x7fe28e4290c8>]}>
それで、どうにかして期間をハッシュキーとして機能させることができるかどうか疑問に思っていますか? これまでのところ、良い解決策は見つかりませんでした。解決策があるかどうかもわかりません。重要なのは、(Time.now - duration) のような関数が機能し続けることです。
参考までに: 私の Ruby バージョン - 1.8.7、Rails バージョン - 2.3.18