LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-19

はじめに

Rails6でER図を自動生成する方法をまとめました。
Rails6の場合、ファイルのオートロードにZeitwerkをデフォルト使用しているのですが、これの影響でうまくER図を生成できなかったので対処法も記載しました。

開発環境

Rails: 6.0.3
Ruby:2.7.1
Macbook Pro
Graphviz
GraphQL(これで自動生成されたファイルが原因だった。)

ER図の設定

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

Gemfile
group :development do
  gem 'rails-erd'
end

必要に応じてgitignoreに設定する。

.gitignore
*.dot

下記のコマンドでER図の生することができます。

$ bundle exec erd --filetype=dot

dot形式からpng形式の変更は下記のコマンドでできます。

$ dot -Tpng erd.dot -o erd.png` (erd.dotはファイル名)

自動生成の設定

migrate時にER図を自動生成するにはRakefileで設定を行います。
もし自動生成が必要でなければ、ここの記載は必要ありません。

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/application.rb
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で自動生成されたファイルが原因だったので下記のように変更した。

base_interface.rb
module Types
  module BaseInterface
    include GraphQL::Schema::Interface
    field_class Types::BaseField 
  end 
end

対策後↓

base_interface.rb
module Types::BaseInterface
  include GraphQL::Schema::Interface
  field_class Types::BaseField
end

そのほかのファイルも変更する。

base_scalar.rb
module Types
  class BaseScalar < GraphQL::Schema::Scalar
  end
end

対策後↓

base_scalar.rb
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を使用したため、オーロロードが正しくできず、発生したエラーだった。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2