背景
- 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に登録済みのタイムスタンプをマイグレーションファイルのファイル名に付けておけば実行されない。