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

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

[markdown]

> * [Rake – Railsドキュメント](http://railsdoc.com/rake)

## 手順

### rake db:version

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

“`prettyprinted
% 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 は修正前の状態です。

“`ruby
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 ``` 元に戻します。 ```prettyprinted % rake db:rollback == CreateTaskTags: reverting ================================================= -- drop_table("task_tags") -> 0.0011s
== CreateTaskTags: reverted (0.0043s) ========================================
% rake db:version
Current version: 20131002103504
“`

### ファイルの修正

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

“`prettyprinted
% 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 を修正します。

“`ruby
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 を実行して完了。 ```prettyprinted % 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:migrate – リファレンス – Railsドキュメント](http://railsdoc.com/references/rake%20db:migrate)
> * [新しいマイグレーションを追加してテーブルを変更 – Ruby on Rails入門](http://www.rubylife.jp/rails/model/index7.html)

## 補遺

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

“`prettyprinted
$ rake db:rollback STEP=2
“`

> * [マイグレーションのロールバック – Ruby on Rails入門](http://www.rubylife.jp/rails/model/index8.html)

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

最初のバージョンに戻す

“`prettyprinted
$ rake db:migrate VERSION=0
“`

### rake db:seed

> * [rake db:seedを使った初期データの投入 – Ruby on Rails入門](http://www.rubylife.jp/rails/model/index10.html)

[/markdown]