中間テーブルとアソシエーション
どうもバンバンです。
今回も備忘録として学習した内容を残しています。
中間テーブル
2つのテーブルの中間にあるテーブルのこと。
多対多の関係にある2つのテーブルの間に挟まって、2つの
組み合わせパターンだけをレコードとして保存する。
中間テーブルの役割確認
ex) instagram
タグを保存するテーブル
tagテーブル
写真を保存するテーブル
photosテーブル
どの写真にどのタグが登録されているかを保存するテーブル
photos_tagsテーブル
一つのタグは複数の写真を持っている
一枚の写真は複数のタグを持っている
以上のことからtagテーブルとphotosテーブルは多対多といえる
中間テーブルにはどの写真にどのタグが登録されているか
という情報が記録されている。ひとつのレコードには「photo_id × tag_id」の組み合わせが記録され、すべての写真とタグの組み合わせの数だけ、レコードが蓄積されていきます。
導入の仕方(アソシエーションの組み方)
・has_manyメソッドのthroughオプションを使用
・belongs_toメソッドを中間テーブルのモデルに記載
上の図より
photosテーブルは
photos_tagsに1対多
tagsに多対多であることから
models/photo.rbに
has_many :photos_tags 1対多
has_many :tags, through: :photos_tags photos_tagを経由して多対多の関係で表すことができる。
同じ用にtagsテーブルでは
has_many :photos_tags 1対多
has_many :photos, through: :photos_tags photos_tagを経由して多対多の関係で表すことができる。
photos_tagsからみると1対1の関係になるため
belongs_to :photo 1対1
belongs_to :tag 1対1
というふうに記載すれば良い
復習
has_manyメソッド
1対多の関係があることを示すメソッド
上の図でいうなら
一人のユーザーは複数のツイートを持っている関係と言える
つまり1対多。
この場合の記述は
models/user.rbにhas_many :tweetsと記載する
ユーザーから見るとツイートは複数あるのでtweetsと複数形で
表現する
belongs_toメソッド
1対1の関係があることを示すメソッド
上の図でいうなら
一つのツイートは一人のユーザーに所属している関係と言える
つまり1対1。
models/twwet.rbにbelongs_to :userと記載する。
ツイートから見るとユーザーは一人なので単数形