LoginSignup
28

More than 5 years have passed since last update.

db:migrateする際に更新されたER図を自動出力する

Last updated at Posted at 2016-11-18

やりたきこと

  • 現状のModel定義からER図を自動生成する
  • db:migrateする際にER図を自動更新する

環境

  • Ruby: 2.3.1
  • Rails: 5.0.0.1

Modelの定義

サンプルとしてUserがGiftを持つtable構造を定義します。
図にすると下記の通りです。
erd.png

$ rails g model gift name:string
$ rails g model user name:string
$ rails g model user_gift user:references gift:references
app/model/user.rb
class User < ApplicationRecord
  has_many :user_gift
  has_many :gift, through: :user_gift
end
app/model/gift.rb
class Gift < ApplicationRecord
  has_many :user_gift
  has_many :user, through: :user_gift
end
app/model/user_gift.rb
class UserGift < ApplicationRecord
  belongs_to :user # 自動生成
  belongs_to :gift # 自動生成
end
$ rails db:migrate

rails-erdの導入

rails-erdはModel定義からER図を生成するためのGemです。

group :development, :test do
  ...

  gem 'rails-erd'

  ...
end
$ bundle install

この状態で、いったんER図を生成してみます。

$ rails erd

プロジェクト直下に下図の内容の erd.pdf が出力されています🎉

erd.png

db:migrateの際にER図が更新されるようにする

db:migrateのafterをhookします。

require_relative 'config/application'
Rails.application.load_tasks

Rake::Task['db:migrate'].enhance do
  Rake::Task['erd'].invoke
end

ただ、このままだとhookのタイミングの都合なのか、ActiveRecord::InternalMetadataとActiveRecord::SchemaMigrationも図に追加されてしまうので、excludeします。

#{rails_root}/.erdconfig
exclude: 'ActiveRecord::InternalMetadata, ActiveRecord::SchemaMigration'

以上で、

$ rails db:migrate

を実行したタイミングでER図を自動更新してくれるようになります。

せっかくなので、Itemを追加して試してみました。

$ rails g model item name:string
$ rails g migration AddColumnToGift item:references

...
(省略) モデルの関連付け
...

$ rails db:migrate

erd.pdf の内容

erd.png

ちゃんと自動で更新されています🎉

参考

http://qiita.com/kanpou_/items/74eca1846101e6db3387
http://qiita.com/fakestarbaby/items/b505bf4fc4103c998cf2

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
28