Railsのconfig.eager_loadはRakeタスクには影響しない

4578 ワード

何が起きたのか

タイトルの通りですが、Railsで config.eager_loadtrue にしてもRakeタスクではeager loadingが無効になります。

config/environments/production.rb
config.eager_load = true

パフォーマンスのためにそういう判断になっているようです。
Rakeタスクではすべてのクラスが必要ないことも多いと思われるのでそういうことなのでしょう。
雑に確認した範囲では少なくとも4.0から現状最新の7.0までそうなっていました。今後もきっとこの挙動は続きそうです。

https://github.com/rails/rails/blob/v7.0.2.3/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt#L9-L13

何が問題か

eager loadingされていないと何が問題なのでしょうか?
クラスがロード済みであることに依存しているロジックがある場合にうまく動かなかったりマルチスレッド処理があるとエラーになったりします。

# 名前空間下の定数全てを取りたいときとか
Foo.constants

解決するには

少々起動が遅くなったとしてもそんなに大きくないアプリケーションではeager loading出来たほうが便利なこともありますよね。
Rails 6.1以降では config.rake_eager_load を設定することで解決できます。

config.rake_eager_load = true