Help us understand the problem. What is going on with this article?

【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

にすると

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

ということですね。

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

おわりに

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした