こんにちは!システムエンジニアのオオイシです。
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=TITLE | ER図のタイトルを指定 |
--notation=STYLE | ER図の記法を指定 ・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の使い方を忘れてしまったらこの記事を確認してくださいね!