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?

[Rails] Active Recordの関連付け

Posted at

はじめに

Ruby on Rails における Active Record の関連付けは、データベース内のテーブル間の関係を簡単に表現する方法です。この記事では、Rails の主要な関連付けタイプについて解説します。

なぜ関連付けを使うのか?

関連付けを使用する主な理由は以下の通りです:

  1. コードをシンプルに保つ
  2. データベースの操作を簡単にする
  3. モデル間のつながりを分かりやすくする
  4. 共通の操作を一貫して行える

Rails の主要な関連付けタイプ

Rails では以下の 6 種類の関連付けがあります。それぞれを日常生活の例を使って説明していきます。

1. belongs_to(〜に属する)

belongs_to は、「このモデルは他のモデルに属している」という関係を表します。

例:生徒は学級に属している

class Student < ApplicationRecord
  belongs_to :classroom
end

class Classroom < ApplicationRecord
  has_many :students
end

ER 図:

解説:

  • 1人の生徒は1つの学級にのみ属します。
  • classroom_idStudent モデルに存在し、どの学級に属しているかを示します。

2. has_one(1つを持つ)

has_one は、「このモデルは他のモデルを1つだけ持っている」という関係を表します。

例:ユーザーは1つのプロフィールを持つ

class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

ER 図:

解説:

  • 1人のユーザーは1つのプロフィールのみを持ちます。
  • user_idProfile モデルに存在し、どのユーザーのプロフィールかを示します。

3. has_many(たくさん持つ)

has_many は、「このモデルは他のモデルをたくさん持っている」という関係を表します。

例:先生は複数の生徒を持つ

class Teacher < ApplicationRecord
  has_many :students
end

class Student < ApplicationRecord
  belongs_to :teacher
end

ER 図:

解説:

  • 1人の先生は複数の生徒を持つことができます。
  • teacher_idStudent モデルに存在し、どの先生に属しているかを示します。

4. has_many :through(〜を通じてたくさん持つ)

has_many :through は、中間テーブルを介して「このモデルは他のモデルをたくさん持っている」という関係を表します。

例:医者は患者をたくさん持ち、患者は医者をたくさん持つ。予約が中間テーブルとなる

class Doctor < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ApplicationRecord
  belongs_to :doctor
  belongs_to :patient
end

class Patient < ApplicationRecord
  has_many :appointments
  has_many :doctors, through: :appointments
end

ER 図:

解説:

  • 1人の医者は複数の患者を持ち、1人の患者は複数の医者にかかることができます。
  • Appointment(予約)が中間テーブルとなり、医者と患者の関係を橋渡しします。

5. has_one :through(〜を通じて1つ持つ)

has_one :through は、中間テーブルを介して「このモデルは他のモデルを1つ持っている」という関係を表します。

例:従業員は1つの会社PCを持ち、その会社PCは1つの保証書を持つ

class Employee < ApplicationRecord
  has_one :company_computer
  has_one :warranty, through: :company_computer
end

class CompanyComputer < ApplicationRecord
  belongs_to :employee
  has_one :warranty
end

class Warranty < ApplicationRecord
  belongs_to :company_computer
end

ER 図:

解説:

  • 1人の従業員は1台の会社PCを持ち、その会社PCは1つの保証書を持ちます。
  • 従業員は会社PCを通じて間接的に保証書を持つことになります。

6. has_and_belongs_to_many(お互いにたくさん持つ)

has_and_belongs_to_many は、中間テーブルを使わずに直接「このモデルと他のモデルがお互いにたくさんある」という関係を表します。

例:本は複数のジャンルに属し、ジャンルは複数の本を持つ

class Book < ApplicationRecord
  has_and_belongs_to_many :genres
end

class Genre < ApplicationRecord
  has_and_belongs_to_many :books
end

ER 図:

解説:

  • 1冊の本は複数のジャンルに属することができ、1つのジャンルには複数の本が含まれます。
  • books_genres という中間テーブルが自動的に作成され、本とジャンルの関係を管理します。

まとめ

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?