【Rails6】gem `rails-erd`を使おうとしたらエラー`Warning: Ignoring invalid association`


はじめに

コマンド入力で手軽にER図が出力できるgem rails-erdを使ってみたときに発生した以下エラーについて解決法を記載します。

$ bundle exec erd --filetype=dot

Loading application in 'app_name'...
Generating entity-relationship diagram for 1 models...
Warning: Ignoring invalid association :posts on User (model Post exists, but is not included in domain)
Warning: Ignoring invalid association :favorites on User (model Favorite exists, but is not included in domain)
Diagram saved to 'erd.dot'.

※使用説明については公式ドキュメントをご参照下さい。(しばらく更新されてないようです)

環境

OS: macOS Catalina 10.15.1
zsh: 5.7.1
Ruby: 2.6.5
Rails: 6.0.2.1

症状

  • usersテーブル
  • postsテーブル
  • favoritesテーブル

元々は上記のようにモデルが3つあり、メインのusersテーブルにその他2つが関連付けされている状態です。

そのテーブル間の関係をER図で確認したかったのですが、冒頭のエラーが発生し、usersテーブルだけのER図(むしろRelationがないのでE図)が出力される状態。

エラーメッセージ

エラーメッセージを詳しく見ると、ここが問題のようです。(Postモデルで抜粋)

Warning: Ignoring invalid association :posts on User (model Post exists, but is not included in domain)

特に以下が問題。
「Postモデルは存在するけど、ドメインに含まれてないよ!」
と書いています。

model Post exists, but is not included in domain

つまり、どうにかしてドメインに含めてしまえば解決しそうです。

ドメインとは?

自分はインターネット上の住所という認識ばかり持っていましたが、そもそもは領域・定義域という意味です。

つまり、今回はrails-erdが認識してくれる領域に該当モデルが入ってくれていないということになります。

なぜ認識してくれないのでしょう?

結論:解決策

config/environments/development.rb
Rails.application.configure do
#...
  config.eager_load = true #元はfalse
#...
end

上記の設定で、無事に全てのモデルが認識され、読み込めるようになります。

理由

こちらの記事より引用させて頂きます。

Railsアプリケーションで、config.eager_load = falseになっていると、そのクラスが存在するか?(定数が存在するか?)を確認しようとしても、クラスにアクセスする前ならばfalseが返ってきます。

どうやらrails-erdが存在確認しようとしても、

config.eager_load = false

だと存在しないよ!と答えてしまい、冒頭のエラーメッセージに繋がってしまうようです。

そのため、

config.eager_load = true

にすると

クラスにアクセスする前から、クラスの存在確認(定数定義の確認)をできるようになっています。

ということですね。

それぞれの挙動の違いもわかりやすく書かれていた記事だったので、ご興味ある方はご確認下さい。
助かりました

おわりに

最後まで読んで頂きありがとうございました

どなたかの参考になれば幸いです

参考にさせて頂いたサイト(いつもありがとうございます)