“person holding key” by CMDR Shane on Unsplash

Rails 5.1から5.2にアップグレードする際はcache_keyに注意

Tatsuya Tobioka
Ruffnote
Published in
3 min readOct 31, 2018

--

RailsのActiveRecordには cache_key というメソッドがあります。
レコードごとに一意なキーを生成してくれるので、モデルごとにキャッシュを持ちたい場合などに便利です。

さて、このメソッドですが、Rails 5.1から5.2にアップグレードすると仕様が変更されます。

Rails 5.1まではキーにタイムスタンプが含まれていたため、 touch などでモデルを更新すれば、 cache_key も新しくなっていました。
Rails 5.2からは、デフォルトではタイムスタンプが含まれなくなります。

Rails 5.1の場合

以下のようにtouchで更新されます。

> user = User.first> user.cache_key
=> "users/1-20181018010704000000"
> user.touch
> user.cache_key
=> "users/1-20181031010656000000"

Rails 5.2の場合

以下のようにtouchしてもキーは更新されません。

> user = User.first> user.cache_key
=> "users/1"
> user.touch
> user.cache_key
=> "users/1"

対応方法

5.2で追加された cache_key_with_version を使うか、 cache_versioning をfalseにすればOKです。

cache_key_with_versionの例

> user = User.first> user.cache_key_with_version
=> "users/1-20181031011043332613"
> user.touch
> user.cache_key_with_version
=> "users/1-20181031011243871467"

cache_versioningの例

> ApplicationRecord.cache_versioning = false
# モデルごとに変えたい場合は User.cache_versioning = false
> user = User.first> user.cache_key
=> "users/1-20181031011243871467"
> user.touch
> user.cache_key
=> "users/1-20181031011434932637"

これを知らずにアップグレードすると、テストでも気づきにくそうで怖いなぁと思っていたら、ちゃんとリリースノートに書いてあったというオチでした。

ActiveRecord::Base#cache_key will now return a stable key that does not include a timestamp any more.

--

--