OKADA LABO

[Ruby on Rails]アソシエーションについて

アソシエーションとは、Railsにある機能のひとつで、
モデル間の管理するものです。

 

これはどういう働きをするかというと、
コントローラで
モデルをまただいためんどくさいやりとりを
簡単に記述できるようにしてくれます。

 

適用ルールは2つ
①モデルクラス(models/xxxx.rb)に、has_manyやbelongs_toなどの記述がされている
②所属する側のテーブル(データベース)に所属する「クラス名_id」が「カラム」として存在する

 

例えば、
ユーザーがつぶやきを登録するアプリの場合、
データベースには
usersテーブルとtweetsテーブルが存在するわけですが

 

このとき、ふたつの関係が重要です。

 

全てのツイートは、ユーザーのうちの誰かが登録したもの、
一方、ユーザー目線になると、ユーザーは自分の作成したツイートを複数個所持している状態。

 

userモデルにとっては、この状態のことをhas manyの関係「User has many Tweets」の状態です。
一方、tweetモデルにとっては、belongs toの関係Tweet belongs to User」の状態であると言えます。
この概念をそのままおぼえます。
この関係をそのまま、各モデルに記述します。

 

具体的にアソシエーション使用のために、行う記述は

 

app/models/user.rb

class User < ActiveRecord::Base
    devise :database_authenticatable, :registerable,
           :recoverable, :rememberable, :trackable, :validatable
    has_many :tweets ここ
  end

app/models/tweet.rb

class Tweet < ActiveRecord::Base
    belongs_to :user ここ
  end

 

これで、コントローラでのめんどくさい記述
たとえば

 

@tweets = Tweet.where(user_id: current_user.id).order("created_at DESC")

@tweets = current_user.tweets

ですむようになる
(Userモデルのインスタンス.tweetsと記述するだけ)