中間テーブル
テーブルとテーブルの関係性が「多対多」という関係性が存在する場合。
・多対多
関連するテーブルのidをお互いが複数持っている関係性のこと。
たとえば、「ユーザーは複数のチャットルームに所属する」「チャットルームには複数ユーザーが所属する」という場合の関係性。
・・・外部キーへ複数の値を保存できれば良いが、1つのカラムに対して複数の値を保存することはできない。
関連するidが増えるごとにカラムを増やすというパターンも考えられるが、カラムを増やすと、いくつかのレコードにとって不要なカラムが生まれる。
・中間テーブル
2つのテーブルの中間にあるテーブルのこと。
多対多の関係にある2つのテーブルの間に挟まって、2つの組み合わせパターンだけをレコードとして保存する。
「どのデータ(カラム)とデータが関連づいているか」という情報が記録される。ひとつのレコードには関連付けた組み合わせが記録され、その組み合わせの数だけ、レコードが蓄積される。
たとえば、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
この記事が気に入ったらサポートをしてみませんか?