[Ruby on Rails 4] rake db: migrate を rollback で元に戻す

間違えて migrate したファイルを修正し、rake db:migrate を実行する。

手順

rake db:version

現在の状況を確認します。

% rake db:version
Current version: 20131002104226
% ls db/migrate
20130927063810_create_users.rb
20130927093118_create_tasks.rb
20130928114148_add_password_to_users.rb
20130929025154_add_adm_to_users.rb
20131002103504_create_tags.rb
20131002104226_create_task_tags.rb

rake db:rollback

20131002104226_create_task_tags.rb は修正前の状態です。

class CreateTaskTags < ActiveRecord::Migration
  def change
    create_table :task_tags do |t|
      t.integer :task_id
      t.integer :tag_id
      t.timestamps
    end
  end
end

元に戻します。

% rake db:rollback
==  CreateTaskTags: reverting =================================================
-- drop_table("task_tags")
   -> 0.0011s
==  CreateTaskTags: reverted (0.0043s) ========================================
% rake db:version
Current version: 20131002103504

ファイルの修正

巻き戻したので、未決の migration ファイルができています。

% rake db:abort_if_pending_migrations
You have 1 pending migrations:
  20131002104226 CreateTaskTags
Run `rake db:migrate` to update your database then try again.

20131002104226_create_task_tags.rb を修正します。

class CreateTaskTags < ActiveRecord::Migration
  def change
    create_table :task_tags do |t|
      t.references :task
      t.references :tag
      t.timestamps
    end
    add_index :task_tags, :task_id
    add_index :task_tags, :tag_id
  end
end

rake db:migrate

書き換えたファイルで再度 db:migrate を実行して完了。

% rake db:migrate
==  CreateTaskTags: migrating =================================================
-- create_table(:task_tags)
   -> 0.1019s
-- add_index(:task_tags, :task_id)
   -> 0.0011s
-- add_index(:task_tags, :tag_id)
   -> 0.0009s
==  CreateTaskTags: migrated (0.1042s) ========================================

補遺

ステップ数を指定して戻す

$ rake db:rollback STEP=2

バージョンを指定して戻す

最初のバージョンに戻す

$ rake db:migrate VERSION=0

rake db:seed