Rails 5.1から5.2にアップグレードする際はcache_keyに注意
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.