💬

Rails で強制的にすべてのクラスを読み込み

2024/09/08に公開

Railis の development や test 環境ではクラスが遅延読み込みされることがあります。
ここでいう遅延読み込みとは『クラス(定数)が参照されたときに初めて関連するファイルを読み込む』ような仕組みです。
なので例えば rails serverrails console を立ち上げただけでは『まだ全クラスが定義されていない』状態になっています。
詳しくは以下を参照。

基本的には利点がある機能なんですがたまーに調査や検証とかで『全クラスに対して網羅的に走査したい』みたいなことがあります。
例えば『特定のモデルクラスに対してアプリケーション上の制約を満たしているかどうか』みたいな検証をしたり『特定の module を mixin しているクラスを抽出する』などなど。
このようなときにクラスが遅延読み込みされていることで正しく走査できないことがあります。

Zeitwerk::Loader.eager_load_all ですべてのクラスを読み込む

クラスの読み込みは Zeitwerk というライブラリで管理されています。
Zeitwerk::Loader.eager_load_all を呼び出すことで Zeitwerk で管理しているすべてのクラスが明示的に読み込まれます。

Zeitwerk::Loader.eager_load_all

Zeitwerk::Loader.eager_load_all はそれなりに重い処理になるので基本的には必要な箇所でのみ利用するようにするとよいでしょう。

GitHubで編集を提案

Discussion