中間テーブル

テーブルとテーブルの関係性が「多対多」という関係性が存在する場合。

・多対多
関連するテーブルのidをお互いが複数持っている関係性のこと。
たとえば、「ユーザーは複数のチャットルームに所属する」「チャットルームには複数ユーザーが所属する」という場合の関係性。

・・・外部キーへ複数の値を保存できれば良いが、1つのカラムに対して複数の値を保存することはできない。

図11.001

関連するidが増えるごとにカラムを増やすというパターンも考えられるが、カラムを増やすと、いくつかのレコードにとって不要なカラムが生まれる。

・中間テーブル

2つのテーブルの中間にあるテーブルのこと。

多対多の関係にある2つのテーブルの間に挟まって、2つの組み合わせパターンだけをレコードとして保存する。

図12.001

「どのデータ(カラム)とデータが関連づいているか」という情報が記録される。ひとつのレコードには関連付けた組み合わせが記録され、その組み合わせの数だけ、レコードが蓄積される。

たとえば、10個の写真にそれぞれ、異なるタグが3つずつ付いている場合、これらの関係性を表すための中間テーブルには30個のレコードが生成される。

_________________

中間テーブルを経由して、多対多のテーブルへアソシエーションを組むには、これまで使用してきたhas_manyメソッドに、throughオプションを追加記述する必要がある。

・throughオプション

has_manyメソッドのthroughオプション。モデルに多対多の関連を定義する。

class PhotosTag < ApplicationRecord
 belongs_to :photo
 belongs_to :tag
end
class Tag < ApplicationRecord
 has_many :photos_tags
 has_many :photos, through: :photos_tags
end
class PhotosTag < ApplicationRecord
 belongs_to :photo
 belongs_to :tag
end

2020/10/31

この記事が気に入ったらサポートをしてみませんか?