アソシエーションを理解するために
アソシエーションとは「つながり、関連」という意味からもわかるように、シンプルに言えば「テーブル同士の関連付け」を行ってくれるものです。
じゃあ関連づけるとどんないいことがあるの?ということをまとめていこうと思います。
テーブル同士の関連づけとは
アソシエーションは、異なる2つのモデルの間に、「1:N」の関連性を持たせるため、まずアソシエーションを理解するためには「1:N」の関係の理解が大切です。
【ちなみにこのNはNatural number(自然数)のことらしいです。】
アソシエーションはモデルに記述していきます。
1:Nの関係とは
ありがちでわかりやすい例えをすると、User対Postの関係は「1:N」です。
1人のUserは複数個(N個、0個以)、Post(投稿)することができます。
それでは、1:Nの関係性をモデルに実装していきます。
Userモデルに対してPostモデルが1:Nになるよう関連づけました。
class User < ApplicationRecord
:
has_many :posts, dependent: :destroy
end
has_manyとは
文字の通り「たくさん持っている」という意味です。
「1:N」の1側がたくさん持っているよ、という意味のなので「1」であるUser側に記述します。これで1人のUserはたくさんPostできるよ、という意味になります。
dependent: :destroyとは
この記述があると、1側のUserが削除された場合、紐づくN側(Post)も全て削除されます。これがないとUserが不明な投稿だけが残ることになります。
次はPostモデル側にもUserモデルと関連づける記述をする必要があります。
class Post < ApplicationRecord
:
belongs_to :user #belongs_toの引数は単数形
end
belongs_to とは
belongs_toは「属する」という意味です。つまりUserに属するという意味になります。
「1:N」のN側が1側に属するとことになるので、belongs_toは属する側である「N」に「なに」に
属するのかを記述します。
それで結局なにが便利なの?
UserとPostで例えてみましょう。
♦︎Userテーブル | |
---|---|
user_id | name |
1 | Apiyo |
2 | Bpiyo |
3 | Cpiyo |
♦︎Postテーブル | ||
---|---|---|
Post_id | User_id | title |
1 | 1 | 美味しいBeer |
2 | 3 | 世界のWine |
3 | 1 | Wiskyボトル |
PostテーブルにUser_idカラムを格納することで、PostとUserを紐付けることができます。
つまりどのUserがどの投稿しているのかを判別できます。
じゃあ何が便利になるのか。
このアソシエーションをしない場合、Postを取り出すには次のコードが必要になります。
@user = User.find(1)
@posts = Post.where(user_id: @user.id)
Whereメソッドを使って、そのuserに関連するPostを探してくるために長い記述が必要です。
しかしアソシエーションを施していると・・・
@User = User.find(1)
@posts = @user.posts
@userに紐づいているpostを探すという、見るだけでわかりやすい記述になります。
whereメソッドを使って探さなくても、@userに関連する投稿を全て取得できます。
アソシエーションを行うことで、コードでの共通操作をよりシンプルに行うことができ、これがアソシエーションを利用する上で便利な点です。
少しはアソシエーションと仲良くなれたでしょうか?