ロープレで頭をフル稼働させ、すでに力尽きかけている もそ。
まじで頭から湯気が出そうになります...そのうち知恵熱出すんじゃないかこれ...。
今日はエラー解決シリーズを一旦お休みして、アソシエーションについて書いていこうと思います。
アソシエーションとは?
一言で説明すると、ずばりモデルとモデルを結びつけること。
これがアソシエーションです。
たとえば、"Tweetモデル"と"Usersモデル"という2つのモデルがあるとします。
この2つはそれぞれtweetsテーブル、usersテーブルの情報を取りだしてコントローラに渡す役割をします。
いま、コントローラがtweetsテーブルとusersテーブルの中身を渡してもらう処理を出したとします。
すると、
1.Tweetモデルに指示を出す
2.Tweetモデルがtweetsテーブルから情報を探す
3.探した情報をコントローラに情報を渡す
という処理の流れが発生します。
同様に、Userモデルにもデータを渡してもらって...という処理が発生します。

今回はモデルは2つだけですが、たとえばモデルがたくさんある場合だと、情報が欲しいテーブルに結びついているすべてのモデルを呼び出すため処理が重くなってしまいます。
そこでアソシエーションで、モデルともモデルを関連つけておきます。
そうすると、あるモデルが呼び出された時に紐付いたほかのモデル配下のデータも引き出せるというわけです。
今回の場合であればTweetモデルとUsersモデルをアソシエーションにしておくと、tweetsテーブルの情報とusersテーブルの情報をコントローラに渡すことができます。

コードを確認してみよう!
ではアソシエーションの記述はどのようにされているか、実際のコードを確認してみましょう。
1. class UsersController < ApplicationController
2. def show
3. user = User.find(params[:id])
4. @nickname = user.nickname
5. @tweets = user.tweets.page(params[:page]).per(5)
6. end
7. end
ここで、上から5行目の
5. @tweets = user.tweets.page(params[:page]).per(5)
この記述に注目してみましょう。
中の要素を分解していくと、tweets
という記述が出てきます。
このtweets
がどこから出てきたかと言うと、モデルファイルで定義されています。
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :tweets
has_many :comments
end
こちらのモデルファイルの上から4行目で、**「一人のuserは複数のtweetsをもつ」**と定義しています。
これによって、コントローラファイルでtweets
の記述が使えるようになりました。
テーブルで確認してみよう!
テーブル間の結びつきを図にしてみました。
同じ色の線で結ばれているのが、あるユーザーのもつ複数の情報になります。
たとえばusersテーブルのid 3の情報を指定すると、tweetsテーブルのid 4,5,6の情報も一緒に取得できます。
--
いかがだったでしょうか?
ファイルをまたぐと変数や定義された記述の動きがわからなくなってしまいますが、図解も駆使して理解していこうと思います。
もその修行はまだまだ続く...。