【Rails入門】Rails ERDでER図を自動作成しよう!オプションも網羅

こんにちは!システムエンジニアのオオイシです。

Rails ERDをご存知ですか?

Rails ERDを使うとRailsのモデルからER図を自動生成することができます。

今回は、

  • Rails ERDとは
  • Rails ERDをインストールする方法
  • Rails ERDを使ってみよう

といった、基本的な解説から

  • ER図をカスタマイズする方法
  • リレーション別のER図サンプル

などの応用的な使い方についても解説していきます。

今回はそんなRails ERDの使い方をわかりやすく解説します!

目次

Rails ERDとは

Rails ERDとは、RailsモデルのER図を自動生成するためのgemパッケージです。

生成したER図は、例えばこのような画像が生成されます。

出典: Rails ERD – Gallery of example diagrams

ER図(Entity-Relationship Diagram)とは、データモデルの構造や関連を表現するための記法です。

ER図の作成はタイミングは、一般に、プログラミングする前の設計段階で作成しますが、Ruby on Railsの場合はモデルの作成・変更が容易なので、プログラミングしながらER図をするのも効率的です。

既存のモデル構造を把握したい場合にも有効です。

そんな、Rails ERDのインストール方法を次項で解説していきます!

Rails ERDをインストールする方法

ここでは、Rails ERDのインストール方法について解説します。

Graphviz(グラフビズ)インストール

Rails ERDは、Graphviz(グラフビズ)というグラフ作成ツールを内部的に使っているので、これをインストールします。

いろいろな環境で利用できますが、ここでは、Max OS XとWindowsでインストールする方法について紹介します。

Max OS Xにインストールするには、Homebrewからインストールします。

$ brew install graphviz

 

Windowsにインストールするには、公式サイトのDownloadページからダウンロードしてインストーラーに従ってインストールしてください。

msiパッケージだと設定が不要なのでオススメです。

Rails ERDのGemパッケージのインストール

Gemfileファイルのdevelopmentグループに次のgemを追記してください。

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

bundle installします。

$ bin/bundle install

これで、Rails ERDのインストールが完了しました!

なお、bundle install については、こちらで詳しく解説しているのでぜひ参照してください。

Rails ERDを使ってみよう

Rails ERDを実行するためには、

  • bin/bundle exec erd

で実行できます。

実行すると、カレントディレクトリに erd.pdf ファイルが作成されます。

1対1の関連がある従業員(Employee)モデルと従業員の住所(Address)モデルのER図を作成するサンプルコードを確認してみましょう。

これから作成するER図はこのようになります。

モデルは次のように作成しています。

マイグレーションファイル作成:

$ bin/rails g model Employee name:string
$ bin/rails g model Address address:string employee:references
$ bin/rake db:migrate

多重度を1対1とするためのコードを従業員(Employee)モデルに追記します。

従業員(Employee)モデル:

class Employee < ApplicationRecord
  has_one :address # 追記
end

住所(Address)モデル:

class Address < ApplicationRecord
  belongs_to :employee
end

Rails-ERDを実行します。

$ bin/bundle exec erd
Loading application in 'erd'...
Generating entity-relationship diagram for 5 models...
Diagram saved to 'erd.pdf'.

このように、erd.pdf が出力されました。

次項では、RAILS-ERDの便利なオプションについて紹介していきます。

なお「rails g migration」については、こちらで詳しく解説しているので、ぜひ参考にしてみてください。

Railsのモデルについては、こちらを参考にしてください。

ER図をカスタマイズする方法

RAILS-ERDには、ER図をカスタマイズするためのオプションが用意されています。

その中でもよく使うオプションについて網羅したので紹介していきます。

オプション説明
--title=TITLEER図のタイトルを指定
--notation=STYLEER図の記法を指定
・simple(デフォルト)
・bachman
・uml
・crowsfoot
--attributes=TYPE,...ER図の属性(attribute)表示制御
・content = キー属性以外を表示(デフォルト)
・false = 属性の表示なし
・primary_keys = 主キーを表示
・foreign_keys = 外部キーを表示
・timestamps = タイムスタンプを表示
--inheritance=trueサブクラス(STI)を表示
--polymorphism=trueポリモーフィックを表示
--only="Model,..."表示するモデルを指定
--exclude="Model,..."除外するモデルを指定
--filename=FILENAME出力ファイル名を指定
--filetype=TYPE画像ファイルの形式
・pdf(デフォルト)
・png
・jpeg
・gif
・svg

この表を参考に、次の条件でER図を作成するサンプルを確認してみましょう。

  • タイトル(–title) = 従業員ER図
  • 出力する属性(–attributes) = 主キーのみ
  • ファイル名(–filename) = employee
  • 画像の種類(–filetype) = png
$ bin/bundle exec erd --title="従業員ER図" --attributes=primary_keys --filename=employee --filetype=png
Loading application in 'erd'...
Generating entity-relationship diagram for 5 models...
Diagram saved to 'employee.png'.

このようにカスタマイズした結果を出力することができました。

リレーション別のER図サンプル

ここでは、モデルの関連に応じたのER図のサンプルを紹介いたします。

1対多関連のER図(hash_many)

1対多の多重度の場合のER図はどうなるかを確認するために、従業員(Employee)従業員の住所(Address)を使って確認してみます。

class Employee < ApplicationRecord
  has_many :address # has_one から変更
end

このように、従業員(Employee)と従業員の住所(Address)は1対多であることがER図からも確認できました。

多対多関連のER図(has_many :through)

多対多の関連とは、例えば、従業員(Employee)部署(Dept)に複数所属できる場合で、営業と総務を兼務する場面を想像すると分かりやすいと思います。

次のようなER図になります。

モデルは次のとおりです。

マイグレーションファイル:

$ bin/rails g model Dept name:string
$ bin/rails g model EmployeeDept employee:references dept:references
$ bin/rake db:migrate

多対多の関連にするために、モデルを修正します。

従業員(Employee)モデル:

class Employee < ApplicationRecord
  has_many :address
  has_many :employee_depts  # 追記
  has_many :depts, through: :employee_depts  # 追記
end

部署(Dept)モデル:

class Dept < ApplicationRecord
  has_many :employee_depts  # 追記
  has_many :employee, through: :employee_depts  # 追記
end

それでは、RAILS-ERDを実行してみましょう。

$ bin/bundle exec erd --title="従業員ER図 多対多" --filename=employee3 --filetype=png --exclude=Address

このように、プログラムでは分かりにくいモデルの関連ER図にすることで理解しやすくな事がわかっていただけたと思います。

STI(単一テーブル継承)のER図

Rails-ERDはSTI(単一テーブル継承)も出力できます。

STIとは、モデルから継承したサブクラスが複数で、データベーステーブルは1つで管理するための仕組みです。

例えば、動物(Animal)を継承した犬(Dog)猫(Cat)モデルを想像するとわかりやすいと思います。

ER図は次のようになります。

マイグレーションファイル:

$ bin/rails g model Animal name:string type:string
$ bin/rake db:migrate

動物(Animal)、犬(Dog)、猫(Cat)モデル:

class Animal < ApplicationRecord
end

class Dog < Animal
end

class Cat < Animal
end

それでは、RAILS-ERDを実行してみましょう。

STIのモデルを出力するためには、inheritance=trueオプションを追加する必要があります。

このオプション追加しなかった場合は、親クラスのみが出力されます。

bin/bundle exec erd --title="STIのER図" --filename=employee5 --filetype=png --inheritance=true --only="Animal,Dog,Cat"

今回は指定したモデルのみを出力したいため、–onlyオプションを追加してRails-ERDを実行しました。

つづいて、ポリモーフィック関連のER図を作成してみます。

ポリモーフィック関連のER図

Rails-ERDは、–polymorphism=true オプションを追加することで、ポリモーフィック関連のモデルのER図も作成できます。

出力結果はこのようになります。

それでは、サンプルコードを確認してみましょう。

マイグレーションファイル:

$ bin/rails g model Employer name:string
$ bin/rails g model Message messageable:references{polymorphic}
$ bin/rake db:migrate

メッセージ(Message)モデル

class Message < ApplicationRecord
  belongs_to :messageable, polymorphic: true
end

従業員(モデル)

class Employee < ApplicationRecord
  has_many :message, as: :messageable
end

雇用者(Employer)モデル

class Employer < ApplicationRecord
  has_many :message, as: :messageable
end

それでは、RAILS-ERDを実行してみましょう。

$ bin/bundle exec erd --title="ポリモーフィックER図" --filename=employee6 --filetype=png --polymorphism=true --only="Employee,Employer,Message"

このように、ポリモーフィック関連のモデルでも出力することができました!

まとめ

いかかでしたか?

今回はRails-ERDでER図を作成する方法について解説しました。

Rails-ERDを使うとRailsのモデルからER図を作成することが可能です。

STI(単一テーブル継承)やポリモーフィック関連などの高度なモデルでも使えるので、ぜひ活用してください。

そして、Rails-ERDrの使い方を忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次