アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

HABTMのテーブル作成方法

こんにちは、endoです。

今回は「HABTM」のテーブル作成の方法です。

「has_and__belongs_to_many」の多対多の関係性を頭文字で略語で表示しているものです。

発音はなんて発音されているのでしょうか。 自分は「ハブトゥム」って読んでいますが、どんな呼び方をしているのか気になります。 こんな呼び方があるよって方は、ぜひ教えてください!

さて、「HABTM」ですが、テーブル作成で便利に作成することができます。

rails g migration create_join_table_facility_prefecture facility prefecture

こんなファイルが出来上がります。

class CreateJoinTableFacilityPrefecture < ActiveRecord::Migration
  def change
    create_join_table :facilities, :prefectures do |t|
      # t.index [:facility_id, :prefecture_id]
      # t.index [:prefecture_id, :facility_id]
    end
  end
end

これでもいいのですが、foreign_keyに対して爪が甘いなと思います。

そこで、これを改造します。

class CreateJoinTableFacilityPrefecture < ActiveRecord::Migration
  def change
    create_join_table :facilities, :prefectures do |t|
      t.references :facility, index: true, foreign_key: true
      t.references :prefecture, index: true, foreign_key: true
      # t.index [:facility_id, :prefecture_id]
      # t.index [:prefecture_id, :facility_id]
    end
  end
end

なお、改造しなくてもrails5.1.1は下記のコマンドでいけます。

rails g migration create_join_table_facility_prefecture facility:references prefecture:references
class CreateJoinTableFacilityPrefecture < ActiveRecord::Migration[5.1]
  def change
    create_join_table :facilities, :prefectures do |t|
      t.references :facility, foreign_key: true
      t.references :prefecture, foreign_key: true
    end
  end
end

issue自体は下記で上がっていました。

create_join_table should include indexes and foreign key contraints

取り込まれて使用できるようになっております。

foreign_key好きが突っ込むよな!って思ったので、嬉しかったです。

アクトインディではHABTMについて語りたいエンジニアを募集しております。