Rails 一日一つメソッド (Day22) Associations- 中間テーブルとthroughオプション
Rails 一日一つメソッド (Day22) Associations-中間テーブルとthroughオプション
Associations-中間テーブル( middle or join table )とthroughオプション
1) 多対多の関係 ( many-to-many )
一人の教師は複数の科目を教えることもできるし、一つの科目に複数の教師が教えることもできる。このような関係を表現するためには中間テーブルが必要になる。
多対多の関係構文 - teacherテーブルとcoursesテーブル - 中間テーブルの teacher_coursesは teacher_idと course_idを外来キーとして持つ。Active Record - 中間テーブルは has_many :throughまたは has_and_belongs_to_many連関関係を使って二つのモテるを紐付ける。
2) 中間テーブルが必要な理由
- 中間テーブルが必要な理由としては、多対多の関係を効率的に管理するため。 - 多対多の関係は一つのレコードが他のレコードの複数のレコードと紐付くことができるし、その逆の場合もできるような状態をいう。 - このような複雑な関係をDabaBaseで表現し、管理するためには中間テーブルが必要になる。
2-1) カラムの数が多くなる。 - テーブルに多数のカラムが定義された時に発生し、カラムの数が多くなるとテーブルの複雑性が増すにつれて、データ管理とクエリの性能が低下する可能性がある。
2-2) 未使用(NULL)のカラムが多くなる。 - NULL値が多くなると必要ではないことを意味する。
2-3) NULLが沢山入ってしまうアンチパターンという良くない設計になる。
- テーブルにNULL値が多いということは、テーブル設計が特定の事例に適合していないか、データモデリングが適切でないことを意味する。
3) 多対多の関係構文と例題
- 多対多の関係を使う時は、モデルクラスに has_manyメソッドの through: オプションを使う。through: は、「経由する」意味で中間テーブルを経由して関連先のオブジェクトを取得できる。
:throughオプション
- has_many :through連関関係は中間テーブルを通して二つのモデルの間に多対多関係を設定する。
class モデル名 < ActiveRecord::Base
has_many :関連名, through: :中間テーブル名
has_many :中間テーブル名
end
class Teacher < ApplicationRecord
has_many :teacher_courses
has_many :courses, through: :teacher_courses
end
class Course < ApplicationRecord
has_many :teacher_courses
has_many :teachers, through: :teacher_courses
end
TeacherCourseは中間テーブルで、teacher_idと course_idを外来キーとして持っている。 Teacherモデルは has_many :professor_courseと has_many :courses, through :professor_coursesを通して Courseモデルと紐づけられる。