LoginSignup
3
0

多対多のマイグレーションファイルの用意

Last updated at Posted at 2024-06-17

概要

  • ちょっとハマった

内容

こんな感じの要件を満たすためにマイグレーションファイルを用意した

  • 既存モデルA
  • 追加モデルB
  • AとBの中間テーブル
class CreateModelB < ActiveRecord::Migration[6.0]
  def change
    create_table :model_b, id: :bigint, unsigned: true do |t|
      t.integer :xxx, null: false, default: 0
      t.integer :yyy, null: false, default: 0

      t.timestamps
    end
  end
end
class CreateModelAModelB < ActiveRecord::Migration[6.0]
  def change
    create_table :model_a_model_b, id: :bigint, unsigned: true  do |t|
      t.bigint :model_a_id, null: false, unsigned: true
      t.bigint :model_b_id, null: false, unsigned: true

      t.timestamps
    end

    add_foreign_key :model_a_model_b, :model_a, column: :model_a_id
    add_index :model_a_model_b, :model_a_id

    add_foreign_key :model_a_model_b, :model_b, column: :model_b_id
    add_index :model_a_model_b, :model_b_id
  end
end

マイグレーションファイルを用意したらあとは実行するのみ

$ rails db:migrate

ハマった話

ModelBのマイグレーションファイルが処理されているときに、テーブルがないよ。的なエラーでて中断されるので、なぜ???ってなっていたが、そりゃそうだなってことに気づく

最初はModelBでも外部キーを用意してたが、そもそも関連付けるテーブルはまだ存在しないので、そりゃそうだってなった

class CreateModelB < ActiveRecord::Migration[6.0]
  def change
    create_table :model_b, id: :bigint, unsigned: true do |t|
      t.bigint :model_a_model_b_id, null: false, unsigned: true # この辺と
      t.integer :xxx, null: false, default: 0
      t.integer :yyy, null: false, default: 0

      t.timestamps
    end

    # こいつら
    add_foreign_key :model_b, :model_a_model_b, column: :model_a_model_b_id
    add_index :model_b, :model_a_model_b_id    
  end
end
  • 先にテーブルを用意
  • 中間テーブルで外部キー関連の定義を行う

これで良し

参考にした記事(感謝)

3
0
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
3
0