Railsのアソシエーションについて

アソシエーションとは


モデル間の関連付けを管理する機能で定義しておくとモデルを跨いだデータの呼び出しを簡単に実装できるおようになる機能。

ツイートをした時にログインしているユーザーのidがtweetsテーブルに保存できるようにすると下図のような関係になる。


アソシエーションを使用する条件


  1. 所属する側のテーブルに「所属クラス_id」カラムがあること(所属する側は上図だとtweetモデル)
  2. 関連するモデルクラスに定義をすること(has_many、belongs_to)

定義の方法


上図を参考にすると、

userモデル

has_many :tweets

userモデルから見るとtweetsは複数あるので「User has_many Tweets」の関係にあると言える為

tweetモデル

belongs_to :user

tweetモデルから見るとuserは単体になるので「Tweet belongs_to User」の関係にあると言える為


アソシエーションを定義した時としない時の違い


アソシエーションを定義することでcontrollerなどに記述するコードが変わってきますので少し紹介します。

以下紹介する2つは同じ意味になります。


<アソシエーションしない時>

#usersテーブルのレコード1を取得
[1]> user = User.find(1)
#tweetsテーブルのuser_idカラムとusersテーブルのidカラムが一致した部分を抽出し配列で取得
[2]> Tweet.where(user_id: user.id)

<アソシエーションする時>

#usersテーブルのレコード1を取得
[1]> user = User.find(1)
#userテーブルから取得したレコードとtweetsテーブルが一致した部分を取得
[2]> user.tweets

ログインユーザーのツイートを取得したい時の記述


@tweets = current_user.tweets

注意:deviseというgemをインストールしていることが条件にあります。


まとめ


  • アソシエーションは、モデル間の関連づけをし、データの呼び出しを簡単にする機能
  • アソシエーションを利用する時は条件を満たす必要がある
  • ログインユーザーを指定して記述する時は、gem deviseをインストールしておく必要がある

コメント

タイトルとURLをコピーしました