概要
- ちょっとハマった
内容
こんな感じの要件を満たすためにマイグレーションファイルを用意した
- 既存モデル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
- 先にテーブルを用意
- 中間テーブルで外部キー関連の定義を行う
これで良し
参考にした記事(感謝)