紳士なブログ

紳士すぎてすみません

多対多の関連

  • 多対多の関連をDBで表現するには、関連のあるテーブルにちょJavaScript苦節外部キーを定義するのではなく、両者への外部キーを持った結合テーブルを用意する
  • Railsでは、このような関連を表現する方法として、has_many :through宣言と、has_and_belongs_to_many宣言という2種類の仕組みが用意されている


has_many :through

  • 結合テーブルを介して1対多のテーブルがあるかのような扱い
  • 結合テーブルテーブルを介しての参照(select, find)はできるが、ActiveRecordはそれ以上の面倒は見てくれない
  • 結合テーブルには任意のカラムが持てる
  • 使用頻度はこちらの方が多い


has_many :through宣言をして多対多の関連を定義する手順

  • 結合テーブルを作成
  • 結合テーブルに対応するモデルクラスから、両クラスへのbelongs_to宣言をする
  • 多対多の関連を持つ双方のクラスでhas_many :through宣言をする


has_and_belongs_to_many(略してhabtm)

  • 結合テーブルの面倒は全てActiveRecordが見てくれる
  • 結合テーブルには2つのテーブルのid以外のカラムを持てない
  • 単純に多対多を実現したい場合はこの方式が便利


■参考