やりたきこと
- 現状のModel定義からER図を自動生成する
- db:migrateする際にER図を自動更新する
環境
- Ruby: 2.3.1
- Rails: 5.0.0.1
Modelの定義
サンプルとしてUserがGiftを持つtable構造を定義します。
図にすると下記の通りです。
$ 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
が出力されています🎉
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
の内容
ちゃんと自動で更新されています🎉
参考
http://qiita.com/kanpou_/items/74eca1846101e6db3387
http://qiita.com/fakestarbaby/items/b505bf4fc4103c998cf2