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