マイグレーションファイルでchange_columnを使うときは気をつけよう。
結論から言うと、(upとdownを設定しておかないと、)ロールバックができなくなるからです。
そもそもの話ですが、バージョンの上げ下げはバージョンの前後の差分が明確にわかって初めてできるのであって、
・create_tableは「0からこの項目を追加する」
・add_columnは、「この項目だけを追加する」とこの一方だけの情報でバージョンアップ前とアップ後の差分がわかります。
例
create_table : hogehoge do |t|
t.string :name
t.text :description
t.timestamps
end
上記のような場合は、何もない0の状態から3つが新規で追加されたと言うことがわかり、
バージョン前:0項目
バージョン後:4項目
と差分がわかります。
そのような場合にはロールバックした際に、削除用のコードを書かなくても、rails側でまるで削除のような処理を行なってくれます。
しかし、
def change
change_column(:hogehoge,:name,:string,limit:10,null:false)
end
のように記述してしまうと、前後の差分がわからなくなってしまいます。
Rails「何もないカラムに追加したの?」
「nameのカラムにlimitとNot Null制約をつけたの?」
「Not Null制約だけつけたの?」
となり、Rollbackができなくなってしまいます。
なので、change_columnを使う際は
def up
change_column(:hogehoge, :name, :string)
end
def down
change_column(:hogehoge, :name, :string, :null:false)
end
のようにupとdownの両方を記述して差分を明記しておかなければならない。
この記事が気に入ったらサポートをしてみませんか?