logo logo

April 21, 2019 06:03

railsでER図を出力する - rails erd

rials erdとは

  • rails erdはrailsアプリケーションのモデルとその関係を解析して、自動でER図(Entity-Relationship Diagrams)を作図してくれるgem
  • 個人開発アプリで、新しいモデルを追加して、既存モデルとどんな関係で結ぼうか思案する際に参考になった
  • 途中参画の開発なんかだと、もっと参考になりそう
  • 出力イメージ(retrieved from Rails ERDimage of er diagram generated by rails erd

使い方

ER図の出力は開発環境での出力が一般的でしょう。図面の出力にはGraphvizを用いるので、まずはそちらをマシンOSに合わせてインストール→gemのインストール→実行&出力という流れ

Graphvizのインストール

  • Mac
$ brew install graphviz  # Homebrew on Mac OS X

または

$ port install graphviz  # Macports on Mac OS X
  • Ubuntu
$ sudo apt-get install graphviz

Docker環境で開発を行なっている場合は、ローカルではなく、そちらの仮想マシンコンソールでGraphvizのインストールを行うのがおすすめです。(そうすれば開発環境に依存せず、どのメンバーも好きなタイミングでER図の出力ができる。)

さもないとこういうstackoverflowに出会うことになる

rake erd filetype=dot : Unable to find GraphViz's "dot" executable.

アプリケーションのルート直下に以下のDockerfileを作成。

既存のruby:2.5.3というベースイメージを拡張する。

FROM ruby:2.5.3
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs
RUN apt-get update -qq && apt-get install -y \
    build-essential \
 && rm -rf /var/lib/apt/lists/*
RUN mkdir /workdir
WORKDIR /workdir
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock
RUN gem install bundler -v 2.0.1
RUN bundle install
RUN apt update
RUN apt install -y graphviz
ADD . /workdir
  • 2行目でnode.jsのバージョンを更新している。これがなかったときに Autoprefixer doesn’t support Node v4.8.2. Update it. というエラーが出現したために修正したもの。
  • 途中のrm -rf /var/lib/apt/lists/*は余計なキャッシュを削除するためのコマンド。
  • bundlerのバージョンはdeploy環境のherokuのバージョンを見越して調整した。
  • graphvizのインストールはプロジェクト内でrails erdの実行をおこなうため。一般にはオプショナルといった感じ

gemのインストールと実行

Gemfileのdevelopment環境のみにrails-erdを追加後、bundle installを実行する。

group :development do
# 〜 省略 〜
  gem 'rails-erd'
end

私個人のrails5環境であれば

$ erd

でルート直下にpdfが出力される。rails erd, rake erdなども可。(この変は環境依存の可能性あり)

参照&捕捉

オプション

オプションを引数の形で与えることができます。個人的には外部キーやらも同時出力できる次のオプションを与えて使いましたが、公式を見るとその他にもいくつかのカスタマイズを可能にするオプションがあります。

$ erd --attributes=foreign_keys,primary_keys,content,timestamp

以下、本家にあるオプションに関する記述を訳しました。(詳細な文意は本家参照)

attributes | false
ダイアグラムにカラムのどの属性まで出力するかを指定する。複数の属性を同時に渡すことができる
- foreignkeys: 関連性を指定している外部キーの出力
- primary
keys: 主キーカラムの出力
- timestamps: モデルに指定されている全てのタイムスタンプカラム
- inheritance: 単一テーブルの継承カラム
the single table inheritance column (typically type)
- content: その他の任意のカラム
- 属性を全て隠すにはfalseを指定。デフォルト値はcontent

disconnected true | false
孤立したentity(他のテーブルentityと一つも関連性がない)を表示するか否かを指定できる。デフォルト値はtrue

filename
出力ファイル名を指定できる。デフォルトはerd

filetype pdf | dot | ...
出力ファイルタイプを指定する。pdfが強く推薦され、その他のフォーマットでは品質が劣化する可能性がある。可能なフォーマットはGraphvizのインストールに依存していて、dotを指定すると生のGraphviz instructionsがdot形式で保存される。Graphvizのインストールは必須ではなく、デフォルト値はpdf

indirect true | false
has_many :throughで指定されるような間接的関連性を出力図中に描画するかどうかを指定できる。古いバージョンのGraphvizでは正しく描画されないことがある。デフォルト値はfalse

inheritance true | false
継承ヒエラルキーを出力するかどうかを指定できる。デフォルト値はfalse

notation simple | bachman
ER図のnotation(矢印で何をどう表すかなど)をどう表示したいかは個々のケースで変わってくる。Rails ERDのデフォルト値(simple)はクラシックで誰にでも理解しやすく、また大抵は十分な情報を含んでいる。とはいえよりリッチにしたい場合はbachman(1992年にCharles Bachmanによって考案された表示形式)を指定することも可能。どのような違いが生じるかは本家のギャラリーを参照

orientation horizontal | vertical
モデル間のヒエラルキー順位を水平方向か垂直方向に描画するかを指定。デフォルト値はhorizontal

polymorphism true | false
ポリモルフィックなヒエラルキーを表示するかどうかを指定できる。デフォルト値はfalse

title true | false |
図中のヘッダータイトルを指定できる。falseにすれば空にもできる。デフォルト値はtrueで、自動的にタイトルが挿入される

warn true | false
図の描画処理中のコマンドラインに表示されるwarningsを表示するかどうかを指定できる。デフォルト値はtrue

only
特定のモデルのみ描画するように指定できる。デフォルトはnilだが、指定したい場合は
only="Order,Customer,Product"といったようにオプションを追加する

exclude
onlyと同様に使用可能。onlyとは逆に図中に表示しないモデルを指定できる