yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY73>アソシエーションについて

\ Follow me!! /

f:id:yujiro0320:20190415152250p:plain

学習状況

●学習日数 73日 

●学習時間(本日) 10.0時間

●累計学習時間 218.0時間

●一日あたりの平均学習時間 2.98時間  [:contents]

アソシエーションとは

モデルをまたいだデータの呼び出しをより簡単に行うことができるようになる事。

使う前提条件は2つ。

①モデルにhas_manyもしくはbelong_toの定義がある事

②所属する側のテーブルに所属するクラス名_idのカラムがある事

has_manyもしくはbelong_toの見分け方

ユーザーを管理するuserモデルと投稿を管理するtweetモデルがあるとする。 あるユーザーが投稿した内容は複数になる可能性がある。 user視点から見たtweetモデルの関係は、has_manyの関係となる。 この関係をモデルに記載する必要がある。

class User < ApplicationRecord
    has_many :tweets
  end

逆視点で見た場合

tweetクラスの視点でuserを見ると、複数のツイートはあるユーザーが発信したとなる。 この為、has_manyとは逆となる。 モデルにはこのように記載する。

 class Tweet < ApplicationRecord
    belongs_to :user
  end

以上がアソシエーションの実装である。

②で記載した所属する側のテーブルに所属するクラス名_idのカラムがある事については、 tweetモデルにuser_idがある状態である。

アソシエーションを使うには

上記定義ができたら、以下のように使用する事ができる。

アソシエーションを使わない場合

(例)ユーザーがツイートしたデーターを取得したい場合。 モデルをまたいでデーターのやりとりができないからこのような処理になる。

user = User.find(1)  #userモデルから指定したユーザーを取得する。
Tweet.where(user_id: user.id) #tweetモデルのuser_idと同じ1の番号を検索する。

使用した場合

user = User.find(1)  #この時点でtweetモデルのuser_idと繋がっている!
user.tweets #ユーザーが投稿した情報を表示する。