#中間テーブルとは
二つのアソシエーションしたいテーブル同士が「多対多」の関係のときに、テーブルの間を受け持つ、便利なやつ。
##具体例
LINEを思い浮かべると、一人のユーザーはいくつものグループに所属している。また、一つのグループには、何人ものユーザーが招待されている。このとき、ユーザーとグループは「多対多」の関係と言える。
##問題点
「多対多」のテーブルをそのままアソシエーションすることが困難である。
##解決策
先の例で言えば、ユーザーとグループの間に組み合わせを記録するテーブルをかませる。それが、中間テーブル。ユーザーとグループの組み合わせを記録するというのがポイントで、カラムにはユーザーidとグループidが必要となる。
##記述
アソシエーションをするため、「has_manyメソッド」「belongs_toメソッド」を使う。
そのモデル(テーブル)ファイルの目線になって、繋がりを持ちたいモデル(テーブル)にはが複数か単数か考える。
ex) user(モデル) has_many groups
ここは、もはや英語の話。
has_many :user_groups
has_many :users, through: :user_groups
has_many :user_groups
has_many :groups, through: :user_groups
belongs_to :user
belongs_to :group
###注意
直接的に繋がっていないモデルには、「throughオプション」を使う。
##ポイント
- 中間テーブルは必ず「belongs_toメソッド」で、後に続くモデル名は単数形。
- アソシエーションしたいテーブル同士は間接的に多対多の関係になる。
- 中間テーブルではないテーブルは必ず「has_manyメソッド」で、後に続くモデル名は複数形。
- 「throughオプション」を使って、経由しているモデル名を複数形で記述。
##最後に
人生で初めてQiitaに投稿します。自分のアウトプットを目的としていますが、お気づきの点があれば、ご指摘ください。