質問: ### 前提 RubyOnRails 5.0.0.1を使用してウェブアプリを作成しようと思っています。 開発にあたり、DBのMigration関連で疑問点が浮上してきたので質問させていただきます。 知りたいのは、正しいMigrationの扱い方についてです。 ### 発生している問題・エラーメッセージ まず、Userモデルをrails generateコマンドで作成したとします。 次に、Userモデルにカラムを使いするために、Migrationファイルを作成しました。 DBに反映させるために、rails db:migtareコマンドを実行しました。 ここまでは問題ないのですが、再度Userモデルにカラムを追加しようとすると、すでにMigrationファイルがあるので、生成できません。 ``` [user@host application_name]$ be rails g migration AddColumnToSites column_one:string invoke active_record create db/migrate/20161123144957_add_column_to_sites.rb [user@host application_name]$ be rails g migration AddColumnToSites column_two:string invoke active_record conflict db/migrate/20161123145007_add_column_to_sites.rb Another migration is already named add_column_to_sites: /home/user/rails/application_name/db/migrate/20161123144957_add_column_to_sites.rb. Use --force to replace this migration or --skip to ignore conflicted file. ``` ### 実現したいこと 上記の状況の場合、新たにカラムを追加したい場合は、既存のマイグレーションファイルを書き換えることで対応するので正しいでしょうか?他の手段があれば、ご教授いただきたいです。 また、既存のマイグレーションファイルを書き換えた場合、rails db:migrateによるDBスキーマへの反映が行えないと思います。schema.rbファイルを削除したのち、rails db:migrate:resetを実行することで、データベース丸ごと更新で対応していますが、どうにか既存のデータを消さずにDBスキーマの更新を行うことはできませんか? また、これらの操作を行うことで、capistranoでのサーバーデプロイ時に本番データが消失する可能性はありますか?まだ試したことがないので、皆様の経験上、そのような事態が発生したことがあるのかが気になっております。 よろしくお願いいたします。
回答: 既存のmigrationファイルを上書きした後に、rake db:migrate:resetすれば全て最初から作り直します。その場合は、データは全て削除されますが。 追加の為にmigrationファイルを作ると今回の様なことになったり、addばかりになると、分かりづらくなるので開発中は、極力、seedでデータを投入できるようにして、createだけで作るといいように思います。 ちなみに、Railsが同じモデルのマイグレーションだと判断した場合に出るエラーメッセージですので、 オプション--skip-migrationを指定する。 既に存在するmigrationファイルを削除する。 のどちらかで、上記のエラーメッセージは出ないと思います。