Rails.cacheの落とし穴
はじめに
仕事で開発をしていた所、コードを動かしていてキャッシュされるべきところがキャッシュされないことがあったのでメモ。
結論
モデルをキャッシュする時、以下のようにしてもキャッシュされない。
@users = Rails.cache.fetch('user_all') do User.all end
なぜか
ActiveRecord は評価を遅延させます。@users = User.allとしてもすぐにSQLが発行されることはなく@users.eachなど発行するクエリが決まった段階でクエリ発行されるわけです。
結論に書いたケースだとUser::ActiveRecord_Relationのインスタンスがキャッシュに入り、インスタンスが評価された段階でSQLが発行されるため、結果としてキャッシュを使っても毎回SQLが発行されてしまうわけです。
どうればいいか
上記の記事を参考にさせていただきました。
以下の用にto_aを使ってクエリを即時発行すればOK。
@users = Rails.cache.fetch('user_all') do User.all.to_a end