LoginSignup
0
1

More than 3 years have passed since last update.

Association ; 1対1、1対多、多対多について

Posted at

Association

Rails には関連 (Association) という仕組みがある。関連付けを用いて二つのモデルをつなぐことで、コードをシンプル、かつ簡単に書くことができる。
関連付けの関係は大きく分けて以下の三種類に分類される。

  • 1 対 1
  • 1 対 多
  • 多 対 多

1 対 1 (has_one, belongs_to)

例えば、Teacher, Class, Student, Subject のモデルで以下の図のような関係性があったとします。
image.png

まずはTeacherとClassの関係性を見てみます。
image.png

ここで表されているのは、

  • 原田先生 は 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)

次に ClassとStudentの関係性を見てみます。
image.png

ここで表されているのは

  • 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の関係性を見てみます。
image.png

線が多いため、Studentモデルのデータごとに色分けしております。
ここで表されているのは

  • 田中さんは 国語、英語、数学 を受講する
  • 矢島さんは 国語、英語、数学 を受講する
  • 中村さんは 国語、英語、数学 を受講する
  • 木下さんは 国語、英語、数学 を受講する

ということがわかります。
ここで、線の色分けをSubjectモデルのデータごとに変えてみます。
image.png

この場合、表されているのは

  • 国語を受講するのは 田中さん、矢島さん、中村さん、木下さん
  • 英語を受講するのは 田中さん、矢島さん、中村さん、木下さん
  • 数学を受講するのは 田中さん、矢島さん、中村さん、木下さん

ということになります。
つまり、Studentモデルのデータひとつに対し、Subjectモデルのデータが複数割り当てられており、またSubjectモデルのデータひとつに対し、Studentモデルのデータが複数割り当てられています。そのため、この関係性は多対多ということになります。
この関係性をコードで表すと以下のようになります。

class Student < ApplicationRecord
    has_and_belongs_to_many :Subjects
end

class Subject < ApplicationRecord
    has_and_belongs_to_many :Students
end
0
1
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
1