学習メモ

Ruby on Railsを中心にプログラミングやWEB技術を勉強しています。

【Rails】rails generateコマンドと元に戻す方法

rails generate scaffoldでファイルを作成した後に処理をやり直そうとしたらつまづいたのでまとめ。 
 
エラーが出たときの処理概要
$ rails generate scaffold hoge
$ rails db:migration
$ rails destroy scaffold hoge
$ rails generate scaffold hoge
$ rails db:migrate (エラー)
 
調べてわかったこと
rails generateで作成されたファイルは、rails destroyで削除できるが、削除前にマイグレーションしたかどうかで元に戻す手順が違うようだった。
 
対応策1:マイグレーション前にファイル削除実行
$ rails generate scaffold hoge
$ rails destroy scaffold hoge
 
対応策2:マイグレーション後はロールバックしてから削除
$ rails generate scaffold hoge
$ rails db:migrate
rails db:rollback
$ rails destroy scaffold hoge
 
対応策3:先に削除したときはデータベースをリセット
$ rails generate scaffold hoge
$ rails db:migrate
$ rails destroy scaffold hoge
rails db:migrate:reset
この場合はデータベースにデータがあったときは消える
 
 
エラーが出たときの動き確認
$ rails generate scaffold hoge
 この時にマイグレーションファイルができる
rails db:migrate
 schema.rbが作成したマイグレーションファイルの内容を元に変更され、バージョン番号が最新になる。
$ rails destroy scaffold hoge
 作成したファイルが全て消えるが、schema.rbの内容は変わらない
$ rails generate scaffold hoge
 再度同名でファイル作成
$ rails db:migrate
 エラー発生:Table “hoges” already exists
 データベース内にすでに同名のテーブルが存在
$ rails db:rollback
 ロールバック試みたがエラー:No migration with version number
 マイグレーションファイルを先に削除しているので見つからない
 Rails内部のshcema_migrationsという名前のデータベース内に、マイグレーションしたときのタイムスタンプが保存されていて、それを参照しているので見つからない
 
作成したファイルの状態とデータベースの状態がどうなっているかを意識しながら処理を進めていかないといけないと思った。
今回はscaffoldで試したが、マイグレーションファイルが作成される処理は他にもあるのでその時も注意していきたい。
 
参考サイト