[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]