はじめに
コマンド入力で手軽に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
が認識してくれる領域に該当モデルが入ってくれていないということになります。
なぜ認識してくれないのでしょう?
結論:解決策
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
にすると
クラスにアクセスする前から、クラスの存在確認(定数定義の確認)をできるようになっています。
ということですね。
それぞれの挙動の違いもわかりやすく書かれていた記事だったので、ご興味ある方はご確認下さい。
助かりました
おわりに
最後まで読んで頂きありがとうございました
どなたかの参考になれば幸いです