🦧

Rails Association 1対多と多対多について(自己学習記録)

2024/10/31に公開

データモデルで1対多の関係性を持たせるには
has_manyとbelongs_toをモデルに加える必要がある。
例えは部門と従業員の例で考えてみよう

department_id department_name
1 営業
2 開発
3 人事
employee_id employee_name Department_id
101 山田 1
102 鈴木 1
103 佐藤 2

この場合、部門(1)には複数の従業員(多)がいるので、
has_many :employees, belongs_to department とモデルに加える
ここまでは分かりやすい。
問題は多対多の関係だ。
従業員と部門の関係から発展させて考え、従業員が複数の部門に所属できるとする。
すると、テーブルは以下の通りとなる。

department_id department_name
1 営業
2 開発
3 人事
employee_id employee_name
101 山田
102 鈴木
103 佐藤
department_id employee_id
101 1
101 2
102 1
103 2
103 3

この多(部門)対多(従業員)を管理するには部門と従業員モデルにhas_manyを追加し
中間テーブル(EmployeeDepartment)を介して関連づける必要がある。

class Department < ApplicationRecord
  has_many :employee_departments
  has_many :employees, through: :employee_departments
end

class Employee < ApplicationRecord
  has_many :employee_departments
  has_many :departments, through: :employee_departments
end

clas EmployeeDepartement < ApplicationRecord
  belongs_to :employee
  belongs_to :department
end

Discussion