中間テーブルとアソシエーション

どうもバンバンです。
今回も備忘録として学習した内容を残しています。
 
中間テーブル
2つのテーブルの中間にあるテーブルのこと。
多対多の関係にある2つのテーブルの間に挟まって、2つの
組み合わせパターンだけをレコードとして保存する。

https://tech-master.s3.amazonaws.com/uploads/curriculums//03bf658972e178f7d395d54537911b20.png

中間テーブルの役割確認
タグを保存するテーブル
tagテーブル
写真を保存するテーブル
photosテーブル
どの写真にどのタグが登録されているかを保存するテーブル
photos_tagsテーブル

一つのタグは複数の写真を持っている
一枚の写真は複数のタグを持っている
以上のことからtagテーブルとphotosテーブルは多対多といえる
 

https://tech-master.s3.amazonaws.com/uploads/curriculums//9be4a7c41153ba7f21720be872dd4717.png

中間テーブルにはどの写真にどのタグが登録されているか
という情報が記録されている。ひとつのレコードには「photo_id × tag_id」の組み合わせが記録され、すべての写真とタグの組み合わせの数だけ、レコードが蓄積されていきます。
 
導入の仕方(アソシエーションの組み方)
・has_manyメソッドのthroughオプションを使用
・belongs_toメソッドを中間テーブルのモデルに記載

https://tech-master.s3.amazonaws.com/uploads/curriculums//ebab2cae982f28479fb134d3bf5553f9.png

上の図より
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対多の関係があることを示すメソッド

https://tech-master.s3.amazonaws.com/uploads/curriculums//2c650eac8ca22ee53f29eba5b62c57a0.png

上の図でいうなら
一人のユーザーは複数のツイートを持っている関係と言える
つまり1対多。
この場合の記述は
models/user.rbにhas_many :tweetsと記載する
ユーザーから見るとツイートは複数あるのでtweetsと複数形で
表現する
 
belongs_toメソッド
1対1の関係があることを示すメソッド

https://tech-master.s3.amazonaws.com/uploads/curriculums//799f15841d495a56c2adbcecaac343ac.png

上の図でいうなら
一つのツイートは一人のユーザーに所属している関係と言える
つまり1対1。
models/twwet.rbにbelongs_to :userと記載する。
ツイートから見るとユーザーは一人なので単数形