Rails6でmigrate時に自動でER図を生成する方法

はじめに

Rakefileに設定を追加してmigrate時にER図を自動で生成される方法をご紹介致します。

実行環境

この記事は以下の動作環境で動作確認しています。

  • Rails: 6.0.3
  • Ruby:2.7.1
  • Graphviz

ER図とは

ER図とはEntitiy-Relationship Diagramの略でモデルのカラム情報やモデル同士の関係を示した図です。
model.rbやschema.rbでもカラム情報やモデル同士の関係性はわかりますが、視覚的にわかりやすいので実際の案件でも取り入れることがあります。

Rails ERD

ER図の設定(rails-erdのインストール)

Gemをインストールします。

group :development do
  gem 'rails-erd'
end

ER図は.dotファイルで出力されるので必要に応じて、gitignoreに設定してください。

*.dot

設定が完了したら、下記のコマンドでER図を生成することができます。

$ bundle exec erd --filetype=dot

詳細な出力方法については下記を参照してください。
(ER図の出力方法、ER図に沿った実装方法)

migrate時にER図を自動生成する方法

migrate時にER図を自動生成するにはRakefileで設定を行います。
コメンアウトしている部分の情報はオプションで変更できます。

# migrateのタスクをフックする
Rake::Task['db:migrate'].enhance do
  if Rails.env.development?
    Rake::Task[:after_migrate].invoke
  end
end

# migrateの後のタスク
task after_migrate: :environment do
  Rake::Task[:create_erd].invoke
end

# ER図を作成
task create_erd: :environment do
  # attributes=foreign_keys,primary_keys,timestamps (属性は主キー、外部キー、タイムスタンプを表示)
  # sort=false (カラム名をアルファベット順にしない)
  # filename=hogehoge-erd (ファイル名)
  # filetype=dot (ファイル拡張子)
  sh 'bundle exec erd --attributes=foreign_keys,primary_keys,content,timestamps --sort=false --filename=hogehoge --filetype=dot'
end

もしエラーが発生した場合

私の場合、ER図を生成すると下記のようなエラーが出ました。

$ bundle exec erd
Failed: Zeitwerk::NameError: expected file /app/ファイル名 to define constant Foo::Bar, but didn't

ネストしたmoduleの定義が適切でなかったようなので変更しました。(Zeitwerkの壊し方)

module Foo
  module Bar
    # コード
  end 
end

↓ 変更後

module Foo::Bar
  # コード
end

おわりに

migrate時にER図が生成されましたでしょうか?
アプリの規模が大きくなってくるとmodelの情報がわかりにくくなってくるので、そんなときはぜひER図を導入してみてください.