rake db:migrateの仕組み
db上のscheme_migrationsが読み込み済みのmigration fileかどうかを判断している。
- rake db:migrateがされた際に、railsはmigrationファイルを見に行きます。
- migrationファイル内でそのタイムスタンプがまだ、scheme_migrationsに乗ってないやつを、未読み込みのmigration fileであると認定。
- 未読み込みのmigration fileを読み込みdbにテーブルなりコラムなり作成/編集。
- 同時に読み込んだファイルのタイムスタンプをmigration fileに記録(これでもう同じファイルを次から読み込まない。)
なので、dbを綺麗に保ちたければ消したテーブルのscheme_migrations内のrowも消しておきましょう。そうすれば、やらかしたミスは完全に姿形消します。
以上理解して、冷静に弄りましょう。じゃないとグループ開発で怒られます。
rails g migrateでやらかした時は、以下のフローで対応するといいですよ。
あ、やべ、migration fileの名前きもすぎる
へんな名前のmigration file作って、やり直したいという場合
→まだrake db:migrateしてなければ
セーフです。
migration fileを普通に削除しましょう。rm filepathとかでいつも通り。
→rake db:migrateしちゃってる人
アウト。めんどいです。
落ちついて、drop tableのmigrationファイルを作ってtableを消しましょう。
でもグループ開発しててファイル数増やしたくないし...
migrationファイルの存在自体を抹消したければ、それも可能です。すでにdb上には書き込まれているのでdb上のテーブルを消してやる必要が有ります。(dbに残ってると、scheme.rbに残り汚し続けるので。)db上のを消したければ、①直接mysqlで消す、or ②drop tableのmigration file書く。でも②だと、グループ開発の場合他の人が困る。そもそもcreateするmigration fileがないのにdropのみ存在することになるので。なので、①の直接mysqlからそのテーブル消しましょう。drop table tablenameで消したりましょう。これで存在抹消できます。
ちなみに
db/scheme.rbはdb上のテーブルから描かれる。