ここでご紹介するのはあくまでRailsでモデル同士の関連づけがあった場合に便利に扱う機能のご紹介であり絶対に関連づけがある際に定義しなければ動かないというわけではありませんが知っておくと非常に開発効率が上がる機能なので知識として知っておきましょう。
1:1の場合
1 |
has_one: |
多:1になる場合
それぞれのモデルファイル(app/models/モデル名.rb)に対して下記の記述をします。
多の方のモデルファイル
1 |
belongs_to:1の方のモデル名 |
belongs_toは外部キーとして抱えているただ一人だけ存在する親モデルを指定するイメージです。
1の方のモデルファイル
1 |
has_many :多の方のモデル名 |
has_manyは外部キーとしてリンクしている他のモデルが複数登録が可能であることを示しています。たくさん抱える子供を指定するイメージです。なおここに記述するモデル名はモデル名を複数形にする必要があります。
親(1の方のモデル)が削除されたら紐づく子(多の方のモデル)を削除する。
親が削除されたら子も削除する記述方法はこちらになります。delete_allに比べたら1件1件削除するのでパフォーマンスは悪いですが、関連づけのさらに関連づけまで削除できたりするので使い分けが必要になります。
1 |
dependent: :destroy |
関連づけをまとめて削除ができるのでdestroyに比べるとパフォーマンスが良いです。
1 |
dependent: :delete_all |
また、これらのdependentメソッドが機能するのはdestroyメソッドでの削除の場合だけになるのでその点も注意しましょう。(deleteメソッドでは機能しません。)
実際にプログラム内で使うには?
上記のような指定をすることで下記の指定をすることで親モデルに紐づく子モデルを全て取得することが可能になります。
1 |
親モデル(1).子モデル(多) |
例えば、一意に決まるUserモデルに紐づく、Workモデルがあったとしたらuser.worksと行ったメソッドで全てのUserモデルに紐づくWorkを取得することが可能になります。
多:多の場合
中間テーブルを作成する方法
最も一般的な方法になります。テーブル間の紐付けを管理する中間テーブルを作成します。中間テーブルと1の方のテーブルに「has_many」を設定する必要があります。中間テーブルのhas_manyに「:through」を設定する必要があります。柔軟な反面、自分で行う作業が増えるので大変です。
has_and_belongs_to_manyを使う方法
単純で簡潔に記述ができる。
annnotate(便利なGem)
テーブルの構造を確認したいときにわざわざDBに接続しなくてもモデルファイルを見れば理解できるようになり非常に便利です。
1 2 3 4 5 6 7 8 9 10 |
group :development do # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. gem 'web-console' gem 'listen', '~> 3.0.5' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' gem 'pry-byebug' gem 'annotate' ★追加 end |
既存のファイルにアノテーションが追加されるように下記コマンドを実行する。
1 |
annotation |
Dockerを使っている場合
1 |
docker-compose exec web bundle exec annotate |
これでモデルファイルにDB構造が追記されます。
モデルファイルにDB構造が追記されない場合
下記でannotateの設定ファイルをインストールする。
1 |
rails g annotate:install |
作成された「 lib/tasks/auto_annotate_models.rake 」を開き下記の記述をtrue → falseに変更する。
1 |
'show_indexes' => 'true', |
再度「annotation」コマンドを実行します。
テーブルをマイグレーションで作成するたびにDB構造が追記させる方法
下記コマンドを実行するだけで良いです。
1 |
rails g annotate:install |
この記事へのコメントはありません。