読者です 読者をやめる 読者になる 読者になる

コモディティ化するエンジニア

組み込み系のSI屋から、Railsを扱うWeb系のベンチャーに転職した筆者が、日々ミジンコなりに情報を綴るブログ。

RailsERDをラップして、yamlファイルに従ってER図を出力するgemを作ってみた

Ruby Rails gem

松村 Advent Calendar 2016 の15日目です。 @muramurasan です。

RailsERD

RailsERDという、出力したいModelをオプションで指定して、コマンドラインでER図を出力できるgemがあります。

github.com

Perfect Ruby On Rails という本でも紹介されているgemで、ささっとER図を出力するには非常に強力なgemです。

そんな RailsERD ですが、利用する上で欲しくなってきた機能がありました。
それが、「yamlファイルに記述したModelに従ってER図を出力する」という機能です。

RailsERD単体だと何が困るか

というのも、このRailsERD、毎回コマンドラインでModelを指定して出力するのですが、繰り返し出力することを考えると、手間を感じるのです。
書き捨てのER図ならば、コマンドラインでも良いんですが、実運用を考えると任意のモデル群の図を、複数枚出力したい、モデルが更新されるたびに......ということが想定できます。
例えば、「決済」「カート」「検索」など、ドメイン毎に図を出力したい、かつ、変更があればER図を出力し直したい......といった感じです。

そこで、RailsERDをラップして「yamlファイルに記述したModelに従ってER図を出力する」というgemを作成しました。

FreshERD

前段の説明通り、yamlファイルに記述したModelに従ってER図を出力する、というgemです。
コアの機能は本家RailsERDに依存しており、例えば、最新の rails-erd 1.5 を利用すれば、Railsプロジェクト以外にも適用できたりします。

github.com

前置きはこの辺で、使い方と、実際に使ってみた例を紹介します。

インストール

Gemfileに下記の記述を追加して、bundle install してください。

gem 'fresh_erd'

yamlの記述

Rails Tutorialのプロジェクトを例にyamlを記述してみます。

diagrams:
  tweet:
    - User
    - Micropost
  all:
    - User
    - Micropost
    - Relationship

tweetall の単位でER図が出力されることになります。
このファイルを適当な名前、例えば、fresh_erd.yml という名称で保存しておきます。

実際に使ってみた

以下のように、--inputオプションでyamlのパスを指定し、--outputオプションでER図を出力するフォルダを指定し、コマンドを叩きます。

$ bundle exec fresh_erd --input="fresh_erd.yml" --output="./"

以下が実行結果です。

--- Generate ERD : tweet
Loading application in 'sample_app_rails_4'...
Generating entity-relationship diagram for 4 models...
Diagram saved to './tweet.png'.
--- Generate ERD : all
Loading application in 'sample_app_rails_4'...
Generating entity-relationship diagram for 4 models...
Diagram saved to './all.png'.

以下のようなER図が取得できます。

f:id:muramurasan:20161126192547p:plain

f:id:muramurasan:20161126192553p:plain

以上です!

ちなみにgitのフックと連携して、最新のER図が常にpushされるように......とか妄想しましたが、
やりすぎ感あるのでこの辺に留めておきました。(FreshERDという名前は、この妄想が由来です)