1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アソシエーションって? メモ

Last updated at Posted at 2019-04-17

アソシエーションとは

モデル(テーブル)間の紐付けをする機能のこと。

アソシエーションを使うとデータの呼び出しが楽になる!:point_up::sparkles:

どんなときに使うの?

例)userが複数の画像を追加するとき

id user image1 image2 image3
1 A photo1 photo4 photo7
2 B photo2 photo5 photo8
3 C photo3 photo6 photo9

↑これはダメなテーブルの作り方
 画像を追加するたびにカラムを増やさなきゃいけない
 いちいちデータベースのテーブルのカラムを増やすのなんてめんどくさすぎ:weary:

テーブルを分けるしかない:helmet_with_cross:

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テーブルは
関係のあるテーブルだとわからせたい

:angel_tone2:アソシエーションを使おう

アソシエーションを定義する

アソシエーションを使う条件
①モデルクラスにhas_manyやbelong_toなどの定義がされている。
②所属する側のテーブルに「所属するカラム名_id」というカラムがある。

例)ツイートとユーザーを関連づける
全てのツイートはいずれかのユーザーが作成したもので、
ユーザーは自分の作成したツイートを複数もっているということになる。

:imp:userから見るとtweetを複数持っている→has_manyの関係

app/models/user.rb
class User < ApplicationRecord
    has_many :tweets
end

:scroll:tweetから見るといずれかのuserに属している→beong_toの関係

app/models/tweet.rb
class Tweet < ApplicationRecord
    belongs_to :user
end

アソシエーションを実装する

:frowning2:アソシエーションを使用しない場合

ターミナルでrails cコマンド実行
[1] pry(main)> user = User.find(1)
[2] pry(main)> Tweet.where(user_id: user.id)
  

:umbrella2:tweetsテーブルに対してuser_idがuserのidと等しいコードを取得している。

:relaxed:アソシエーションを使用した場合

ターミナルでrails cコマンド実行
[1] pry(main)> user = User.find(1)
[2] pry(main)> user.tweets

:star:Userモデルに「user has many tweets」の記述をしたので
userモデルのインスタンス.tweetsでそのインスタンスが持つツイートを取得できる。
→短くて楽!:sparkles:

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?