2

私は 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

4

1 に答える 1