背景
- Rails 4.2 で開発していたアプリケーションを 5.2 まで上げたい
- コードが滅茶苦茶だったのと、規模がそこまで大きくなかったので、DBだけ引き継いで新しいアプリケーションとして作りたい
- マイグレーションファイルの設定を誤るとDBの全レコードが消えるのでローカルで慎重に動作確認する
環境
- Ruby on Rails 4.2 -> 5.2
- Ruby 2.5.1
手順
-
rails new xxxコマンドでプロジェクトを作成する - 旧アプリの config/database.yml の内容を新アプリにコピペする
- 旧アプリのモデルを全て
rails g model xxxコマンドで生成する(カラム設定は不要) - 自動生成されたマイグレーションファイルを削除する
- 旧アプリの
db/schema.rbを新アプリのdb/migrations/ディレクトリ配下にコピーする - DBの
schema_migrationsを見て、最新のタイムスタンプを上記のファイル名の先頭に付け、適当なファイル名に変更する(例:20180401100000_create_initial_database.rbなど) - ファイル名に合わせてマイグレーションファイルのクラス名を編集し、
ActiveRecord::Migrationの末尾に旧バージョン[4.2]を付ける。あとdef change ~ endも追加する。 -
rails db:migrateを実行してschema.rbを生成する
解説
- Railsは
rails db:migrate実行時にマイグレーションファイルのタイムスタンプをDBのschema_migrations内レコードと照合し、ファイル名のタイムスタンプがまだDBに登録されていなければ、マイグレーションを実行する。 - そのため既にDBに登録済みのタイムスタンプをマイグレーションファイルのファイル名に付けておけば実行されない。