アソシエーションとは
モデル(テーブル)間の紐付けをする機能のこと。
アソシエーションを使うとデータの呼び出しが楽になる!
どんなときに使うの?
例)userが複数の画像を追加するとき
id | user | image1 | image2 | image3 |
---|---|---|---|---|
1 | A | photo1 | photo4 | photo7 |
2 | B | photo2 | photo5 | photo8 |
3 | C | photo3 | photo6 | photo9 |
↑これはダメなテーブルの作り方
画像を追加するたびにカラムを増やさなきゃいけない
いちいちデータベースのテーブルのカラムを増やすのなんてめんどくさすぎ
テーブルを分けるしかない
userテーブル
id | user |
---|---|
1 | A |
2 | B |
3 | C |
imageテーブル
id | image | article_id |
---|---|---|
1 | photo1 | 1 |
2 | photo2 | 2 |
3 | photo3 | 3 |
4 | photo4 | 1 |
5 | photo5 | 2 |
6 | photo6 | 3 |
7 | photo7 | 1 |
バラバラになっちゃったのでuserテーブルとimageテーブルは
関係のあるテーブルだとわからせたい
→
アソシエーションを使おう
アソシエーションを定義する
アソシエーションを使う条件
①モデルクラスにhas_manyやbelong_toなどの定義がされている。
②所属する側のテーブルに「所属するカラム名_id」というカラムがある。
例)ツイートとユーザーを関連づける
全てのツイートはいずれかのユーザーが作成したもので、
ユーザーは自分の作成したツイートを複数もっているということになる。
userから見るとtweetを複数持っている→has_manyの関係
class User < ApplicationRecord
has_many :tweets
end
tweetから見るといずれかのuserに属している→beong_toの関係
class Tweet < ApplicationRecord
belongs_to :user
end
アソシエーションを実装する
アソシエーションを使用しない場合
ターミナルでrails cコマンド実行
[1] pry(main)> user = User.find(1)
[2] pry(main)> Tweet.where(user_id: user.id)
tweetsテーブルに対してuser_idがuserのidと等しいコードを取得している。
アソシエーションを使用した場合
ターミナルでrails cコマンド実行
[1] pry(main)> user = User.find(1)
[2] pry(main)> user.tweets
Userモデルに「user has many tweets」の記述をしたので
userモデルのインスタンス.tweetsでそのインスタンスが持つツイートを取得できる。
→短くて楽!