<DAY73>アソシエーションについて
学習状況
●学習日数 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 #ユーザーが投稿した情報を表示する。