環境
- Vagrant + Ubuntu 16.04.5 LTS
- Rails 5.2.4.2
はじめに
Railsの開発を進めていくと、開発途中で、テーブルの項目に変更が発生する事がよく出て来ます。チームで開発する場合は、新規にマイグレーションファイルを作成して、個別に、カラムの修正や追加などを行うと思うのですが、個人で開発をしている場合は、いちいちそんな面倒な事はせずに、create_tableを直接修正する方が手っ取り早いという事になります。
そこで、マイグレーションファイルの履歴を遡って、特定のバージョンのみ、マイグレーションファイルを修正して再実行する方法についてまとめてみました。
手順
現状のマイグレーションの履歴を表示して、再実行したいマイグレーションファイルのバージョンを確認する
$ rails db:migrate:status
特定のマイグレーションをdownさせる
$ rails db:migrate:down VERSION=20200504051127
エラーが出てdownできなかった場合は、中身を一時的にコメントアウトして、空のメソッドの状態にすると、強制的にdownさせる事ができます
def change
end
down状態にしてから、マイグレーションを修正する
再び、マイグレーションをupさせます
$ rails db:migrate:up VERSION=20200504051127
再実行したマイグレーションファイルのバージョン以降に、修正したテーブルに対して、add_referenceで、リンクを貼っている場合は、当然、クリアされているので、再実行が必要なマイグレーションを拾い上げて、個別に、再実行してやる必要がありますので、ご注意。
下記の例は、親テーブル(endusers)に子テーブル(tasks)を関連づけています。このマイグレーションファイルも一旦、downさせてから、upさせてやると、tasksテーブルに反映されます。
def up
execute 'DELETE FROM tasks;' # 子テーブルのデータをクリアしないとリンクは張れません
add_reference :tasks, :enduser, null: false, index: true
end
def down
remove_reference :tasks, :enduser, index: true
end
最後に、schema.rbの中身を見て、思い通りの内容に作成されていればOK