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

  • 21
    いいね
  • 2
    コメント

やりたきこと

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