やりたいこと
foosテーブルとbarsテーブルがあったとして
barsテーブルにfoo:references
のカラムを追加したい。
ただし、システムは運用を始めておりbarsテーブルにはデータが入っている。
普通に
db/migrate/YYYYMMDDhhmmss_add_foo_to_bars.rb
class AddFooToBars < ActiveRecord::Migration[6.0]
def change
add_reference :bars, :foo, null: false, foreign_key: true
end
end
でdb:migrate
しようとすると、空のfoo_id
カラムが発生してしまうため、エラーになってしまう。
解決策
まずは初期値を設定してカラムを追加する。
default値はfoosテーブルに存在するid
を指定する。
db/migrate/YYYYMMDDhhmmss_add_foo_to_bars.rb
class AddFooToBars < ActiveRecord::Migration[6.0]
def change
add_reference :bars, :foo, null: false, foreign_key: true, default: 1
end
end
次にDEFAULTの定義を残しておくと気持ち悪いので消す。
db/migrate/YYYYMMDDhhmmss_change_foo_to_bars.rb
class ChangeFooToBars < ActiveRecord::Migration[6.0]
def change
change_column_default(:bars, :foo_id, nil)
end
end
これでデータの入ったテーブルに外部キーが設定されたカラムを追加できます。