マイグレーションファイルでchange_columnを使うときは気をつけよう。

結論から言うと、(upとdownを設定しておかないと、)ロールバックができなくなるからです。

そもそもの話ですが、バージョンの上げ下げはバージョンの前後の差分が明確にわかって初めてできるのであって、

・create_tableは「からこの項目を追加する」
・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の両方を記述して差分を明記しておかなければならない。

この記事が気に入ったらサポートをしてみませんか?