Association
Rails には関連 (Association) という仕組みがある。関連付けを用いて二つのモデルをつなぐことで、コードをシンプル、かつ簡単に書くことができる。
関連付けの関係は大きく分けて以下の三種類に分類される。
- 1 対 1
- 1 対 多
- 多 対 多
1 対 1 (has_one, belongs_to)
例えば、Teacher, Class, Student, Subject のモデルで以下の図のような関係性があったとします。
ここで表されているのは、
- 原田先生 は 2-1 を
- 山川先生 は 2-2 を
担任しているということがわかります。
この場合、Teacherモデルのデータひとつに対し、Classモデルのデータがひとつだけ割り当てられているため、1対1の関係性となっているということになります。
この関係性をコードで表すと以下のようになります。
class Teacher < ApplicationRecord
has_one :Class
end
class Class < ApplicationRecord
belongs_to :Teacher
end
1 対 多 (has_many, belongs_to)
ここで表されているのは
- 2-1 には 田中さんと矢島さん
- 2-2 には 中村さんと木下さん
が属しているということがわかります。
この場合、Classモデルのデータひとつに対し、Studentモデルのデータが複数割り当てられているため、1対多の関係性になっているということになります。
この関係性をコードで表すと以下のようになります。
class Class < ApplicationRecord
has_many :Students
end
class Student < ApplicationRecord
belongs_to :Class
end
多 対 多 (has_and_belongs_to_many)
最後に、StudentとSubjectの関係性を見てみます。
線が多いため、Studentモデルのデータごとに色分けしております。
ここで表されているのは
- 田中さんは 国語、英語、数学 を受講する
- 矢島さんは 国語、英語、数学 を受講する
- 中村さんは 国語、英語、数学 を受講する
- 木下さんは 国語、英語、数学 を受講する
ということがわかります。
ここで、線の色分けをSubjectモデルのデータごとに変えてみます。
この場合、表されているのは
- 国語を受講するのは 田中さん、矢島さん、中村さん、木下さん
- 英語を受講するのは 田中さん、矢島さん、中村さん、木下さん
- 数学を受講するのは 田中さん、矢島さん、中村さん、木下さん
ということになります。
つまり、Studentモデルのデータひとつに対し、Subjectモデルのデータが複数割り当てられており、またSubjectモデルのデータひとつに対し、Studentモデルのデータが複数割り当てられています。そのため、この関係性は多対多ということになります。
この関係性をコードで表すと以下のようになります。
class Student < ApplicationRecord
has_and_belongs_to_many :Subjects
end
class Subject < ApplicationRecord
has_and_belongs_to_many :Students
end