Ruby
Rails
DB
migrate
ER図

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

More than 1 year has passed since last update.


やりたきこと


  • 現状の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