LoginSignup
0
0

More than 5 years have passed since last update.

もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜アソシエーションを克服しよう〜

Last updated at Posted at 2019-04-17

ロープレで頭をフル稼働させ、すでに力尽きかけている もそ。
まじで頭から湯気が出そうになります...そのうち知恵熱出すんじゃないかこれ...。

今日はエラー解決シリーズを一旦お休みして、アソシエーションについて書いていこうと思います。

アソシエーションとは?

一言で説明すると、ずばりモデルとモデルを結びつけること。
これがアソシエーションです。

たとえば、"Tweetモデル"と"Usersモデル"という2つのモデルがあるとします。
この2つはそれぞれtweetsテーブル、usersテーブルの情報を取りだしてコントローラに渡す役割をします。

いま、コントローラがtweetsテーブルとusersテーブルの中身を渡してもらう処理を出したとします。

すると、

1.Tweetモデルに指示を出す
2.Tweetモデルがtweetsテーブルから情報を探す
3.探した情報をコントローラに情報を渡す

という処理の流れが発生します。

同様に、Userモデルにもデータを渡してもらって...という処理が発生します。

無題1189.jpeg

今回はモデルは2つだけですが、たとえばモデルがたくさんある場合だと、情報が欲しいテーブルに結びついているすべてのモデルを呼び出すため処理が重くなってしまいます。

そこでアソシエーションで、モデルともモデルを関連つけておきます。
そうすると、あるモデルが呼び出された時に紐付いたほかのモデル配下のデータも引き出せるというわけです。

今回の場合であればTweetモデルとUsersモデルをアソシエーションにしておくと、tweetsテーブルの情報とusersテーブルの情報をコントローラに渡すことができます。

無題1188.jpeg

コードを確認してみよう!

ではアソシエーションの記述はどのようにされているか、実際のコードを確認してみましょう。

users_conrtoller.rb
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がどこから出てきたかと言うと、モデルファイルで定義されています。

users.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :tweets
  has_many :comments
end

こちらのモデルファイルの上から4行目で、「一人のuserは複数のtweetsをもつ」と定義しています。
これによって、コントローラファイルでtweetsの記述が使えるようになりました。

テーブルで確認してみよう!

テーブル間の結びつきを図にしてみました。
同じ色の線で結ばれているのが、あるユーザーのもつ複数の情報になります。

無題1190.jpeg

たとえばusersテーブルのid 3の情報を指定すると、tweetsテーブルのid 4,5,6の情報も一緒に取得できます。

--
いかがだったでしょうか?
ファイルをまたぐと変数や定義された記述の動きがわからなくなってしまいますが、図解も駆使して理解していこうと思います。
もその修行はまだまだ続く...。

0
0
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
0
0