はじめに
Railsのstrict_loadingは「関連を意図せず遅延ロードしてない?」を検知できる便利機能ですが、Rails v8から strict_loading_mode をグローバル設定できて、しかも :n_plus_one_only が選べる のを最近知りました📝
Allow to configure strict_loading_mode globally or within a model.
Defaults to :all, can be changed to :n_plus_one_only.
https://github.com/rails/rails/blob/8-0-stable/activerecord/CHANGELOG.md
以下の記事で以前書いた時にはstrict_loading_mode = trueしかグローバルに設定できなかったので導入を躊躇っていたのですが、n_plus_one_onlyなら現実的に運用できそうだったので、導入してみたメモ📝
strict_loading_mode=:n_plus_one_onlyをグローバルに有効化する
以下の通り、development/test環境で有効化しました。
# config/environments/development.rb config.active_record.strict_loading_by_default = true config.active_record.strict_loading_mode = :n_plus_one_only
# config/environments/test.rb config.active_record.strict_loading_by_default = true config.active_record.strict_loading_mode = :n_plus_one_only
これだけで、development/test環境で関連の遅延ロードがN+1的に発生した場合に例外が発生するようになります🎉
またTIPSですが、consoleではstrict_loadingによるN+1の検知を無効化したい場合には以下のようにapplication.rb等で無効化してあげると良いかと思います。
# config/application.rb
console { ApplicationRecord.strict_loading_by_default = false }
おわりに
Rails 8でn_plus_one_onlyモードをグローバルで適用できるようになり、strict_loadingの運用がかなり現実寄りになった気がします。
Rails標準機能でN+1を検知できるのはありがたいですね🙏