1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

アソシエーションと仲良くなりたい。

Posted at

アソシエーションを理解するために

アソシエーションとは「つながり、関連」という意味からもわかるように、シンプルに言えば「テーブル同士の関連付け」を行ってくれるものです。
じゃあ関連づけるとどんないいことがあるの?ということをまとめていこうと思います。

テーブル同士の関連づけとは

アソシエーションは、異なる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になるよう関連づけました。

app/model/user.rb
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モデルと関連づける記述をする必要があります。

app/models/post.rb
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に関連する投稿を全て取得できます。
アソシエーションを行うことで、コードでの共通操作をよりシンプルに行うことができ、これがアソシエーションを利用する上で便利な点です。

少しはアソシエーションと仲良くなれたでしょうか?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?