はじめに
Rails6でER図を自動生成する方法をまとめました。
Rails6の場合、ファイルのオートロードにZeitwerkをデフォルト使用しているのですが、これの影響でうまくER図を生成できなかったので対処法も記載しました。
開発環境
Rails: 6.0.3
Ruby:2.7.1
Macbook Pro
Graphviz
GraphQL(これで自動生成されたファイルが原因だった。)
ER図の設定
Gemをインストールします。
group :development do
gem 'rails-erd'
end
必要に応じてgitignoreに設定する。
*.dot
下記のコマンドでER図の生することができます。
$ bundle exec erd --filetype=dot
dot形式からpng形式の変更は下記のコマンドでできます。
$ dot -Tpng erd.dot -o erd.png` (erd.dotはファイル名)
自動生成の設定
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
エラー対策
おすすめしない対策
ファイルのオートロードを行う、zeitwerkの使用をやめてclassicに変更したら、一応自動生成はできたがRspecが通らなくなった。
config.autoloader = :classic
zeitwerkの uninitialized constant XXX (NameError)エラーについて
Railsガイド 2 Zeitwerkモードを有効にする
Railsガイド 11 Zeitwerkを使わない場合
実施した対策
ER図を生成すると下記のエラーが出た。
$ bundle exec erd
Failed: Zeitwerk::NameError: expected file /app/graphql/interface_types/base_interface.rb to define constant Types::BaseInterface, but didn't
どうやらmoduleの定義方法が適切ではないようである。
Zeitwerkの壊し方
GraphQLで自動生成されたファイルが原因だったので下記のように変更した。
module Types
module BaseInterface
include GraphQL::Schema::Interface
field_class Types::BaseField
end
end
対策後↓
module Types::BaseInterface
include GraphQL::Schema::Interface
field_class Types::BaseField
end
そのほかのファイルも変更する。
module Types
class BaseScalar < GraphQL::Schema::Scalar
end
end
対策後↓
class Types::BaseScalar < GraphQL::Schema::Scalar
end
再度ER図を生成すると今度は下記のエラーが出た。
$ bundle exec erd
Failed: RuntimeError: Saving diagram failed!
Verify that Graphviz is installed and in your path, or use filetype=dot.
fileをdotに指定する必要があるとのこと。
$ bundle exec erd --filetype=dot
これで無事にER図を生成できました!
終わりに
Rails6 × GraphQLを使用したため、オーロロードが正しくできず、発生したエラーだった。