45
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsで過去履歴のmigrationを修正して再実行する

Last updated at Posted at 2020-05-04

環境

  • 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テーブルに反映されます。

xxxxxxxxx_add_enduser_id_to_tasks.rb
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

45
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?