Rails.cache と古の timestamp

結論

Rails.cache.write を使う際、 cache するデータにかなり古い timestamp が含まれないようにする

  • Rails v5.1.4
  • Ruby v2.4.1

起きたこと

Rails.cache.fetch で ActiveRecord の配列を cache している箇所で以下のようなエラーが頻発していた。

ArgumentError
year too big to marshal: 1 UTC

原因

そのエラーメッセージでググってみると このページ にたどり着いた。

同じエラーメッセージが出るか再現してみた

Marshal.dump 2016.years.ago
#=> ArgumentError: year too big to marshal: 1 UTC

出た。

Rails のソース とか眺めてみると内部で Marshal.dump が呼ばれているのは間違いなさそう

実際に 0001 年みたいなデータがないか MySQL のクエリを叩いていたら datetime のカラムにそういうのがいた。

で、結論に戻る。

何年前まで大丈夫なのか

rails console で叩いてみたら、 Marshal.dump 117.years.ago まではおkでした。

今回みたいに不正な値が入ったとかじゃない限りあまり遭遇しなさそう。

Contents