概要
Ruby on Railsにおけるモデル同士の関連付けについてアウトプットしたいと思います。
環境
ruby: '3.0.1'
rails: '6.1.4'
前提
関連付けの説明にあたって下記モデルを前提とします。
モデル | User |
---|---|
id | 1 |
name | 'example_name' |
モデル | Post |
---|---|
id | 1 |
content | 'example_content' |
user_id | 1 |
モデル | Account |
---|---|
id | 1 |
account_number | 1234 |
user_id | 1 |
関連付けとは
関連付けとは異なるモデル同士をつなげてコードを簡素化するために行うものです。
関連付けを行っていない場合と行っている場合のコードの違いを見てみましょう。
userの投稿一覧を取得するというコードを比較します。
- 関連付けを行っていない場合
user = User.find(1)
posts = Post.find_by(user_id: user.id)
- 関連付けを行っている場合
user = User.find(1)
posts = user.posts
関連付けの目的
関連付けの目的は主に2点あります。
1. コードの簡素化
上記の例を見ると分かる通り投稿を作成する際にuser_id
を気にしなくて良いので記載するコード量が少なくなりますし、
コードも直感的でわかりやすくなります。
2. コード記載ミスを減らすこと
関連付けを行っていない場合では、上記の例だと投稿を作成する際にuser_id
を気にかけないといけなくなります。
つまり投稿を作成するときは必ずuser_id
の記載が必要になるので、必然的にコード量が増え、記載ミス等が起きやすくなります。
関連付けの種類
関連付けの種類は3つあります。
1. belongs_to
使い方
models/post.rb
class Post < ApplicationRecord
belongs_to :user # 関連名は必ず単数形
end
この関連付けはUser
モデルと__従属__の関係を作ります。
つまり、投稿には必ずユーザーが必要になるということです。
ユーザーのいない投稿は作成できません。
よくhas_many
を定義したモデルの相方で定義されます。
また下記のように投稿したユーザーを取得できるようにもなります。
post = Post.find(1)
post.user #=> 投稿したユーザー情報が返ってきます。
2. has_many
使い方
models/user.rb
class User < ApplicationRecord
has_many :posts # 関連名は必ず複数形
end
この関連付けはPost
モデルと__1対多__の関係を作ります。
つまり一人のユーザーに対して投稿が複数存在するということです。
よくbelongs_to
を定義したモデルの相方で定義されます。
これによりユーザーの投稿一覧を取得できるようになります。
user = User.find(1)
user.posts #=> ユーザーの投稿一覧が返ってくる
またuser_id
を気になくても下記のように投稿を作成することもできます。
user = User.find(1)
post = user.posts.create(content: 'new_content') # 作成の際にuserから自動的にuser_idを取得してくれる
3. has_one
####使い方
models/user.rb
class User < ApplicationRecord
has_one :account # 関連名は必ず単数形
end
関連する2つのモデルでそれぞれ定義する。
この関連付けはUser
モデルとAccount
モデルで1対1の関係を作ります。
よくbelongs_to
を定義したモデルの相方で定義されます。
つまりユーザーは必ず1つのアカウントIDを持っているということになります。
下記のようにユーザーのアカウントを取得することもできるようになります。
user = User.find(1)
user.account #=> userのアカウント情報を取得できる
まとめ
その他にも関連付けの際に使えるオプションもあるので別記事にて記載したので下記をご確認ください。