中間テーブルを実装したい
以前の記事でお送りしたuserとschoolのテーブルについて、
実際にコードで実装しようと思います。
user
| id | user |
|---|---|
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 〜 | 〜 |
school
| id | school |
|---|---|
| 1 | A小学校 |
| 2 | B中学校 |
| 3 | C高校 |
| 4 | D大学 |
| 5 | E大学院 |
| 6 | Foreign_University |
| 〜 | 〜 |
user_school ←中間テーブル
| id | user | school |
|---|---|---|
| 1 | a | A小学校 |
| 2 | a | B中学校 |
| 3 | a | C高校 |
| 4 | a | D大学 |
| 5 | b | A小学校 |
| 6 | b | B中学校 |
| 〜 | 〜 |
モデルのアソシエーション
テーブルとテーブルに関係性を持たせるには、
モデルに記述を追加して、アソシエーションを構築します。
class User < ApplicationRecord
has_many :user_schools
has_many :schools, through: :user_schools
end
class School < ApplicationRecord
has_many :user_schools
has_many :users, through: :user_schools
end
class UserSchool < ApplicationRecord
belongs_to :user
belongs_to :school
end
親テーブルに
has_many :テーブル名(複数形)
子テーブルに
belongs_to :テーブル名(単数形)
のように記述します。
このとき、userテーブルとschoolテーブルは相互に複数のデータに関連を持ちます。
<aさんは、A小学校も、B小学校も卒業>
aさん→userテーブルのデータが、A小学校、B中学校、schoolテーブルに対して複数関連を持っている
<B中学校は、aさんも、bさんも卒業>
B中学校→schoolテーブルのデータが、aさん、bさん、userテーブルに対して複数関連を持っている
中間テーブルは子テーブル
user_schoolsのテーブルに入ってるデータは、
そのひとつのデータから見ると、userテーブル schoolテーブルともにひとつしかありません。
| id | user | school |
|---|---|---|
| 1 | a | A小学校 |
<a も A小学校もそれぞれuserテーブル、schoolテーブルにはひとつのみ> |
そのため、中間テーブルのモデルにはbelongs_toの記述でアソシエーションを記述する点に注意が必要です。
今日はこのあたりで失礼します。