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

Railsのモデル同士の関連付けについて

Last updated at Posted at 2022-01-08

概要

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のアカウント情報を取得できる

まとめ

その他にも関連付けの際に使えるオプションもあるので別記事にて記載したので下記をご確認ください。

## 参考文献
Railsガイド
【Rails】 アソシエーションを図解形式で徹底的に理解しよう!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?