Posted at

RailsでDBを共有する別アプリケーションを作る時のマイグレーション設定

More than 1 year has passed since last update.


背景


  • Rails 4.2 で開発していたアプリケーションを 5.2 まで上げたい

  • コードが滅茶苦茶だったのと、規模がそこまで大きくなかったので、DBだけ引き継いで新しいアプリケーションとして作りたい

  • マイグレーションファイルの設定を誤るとDBの全レコードが消えるのでローカルで慎重に動作確認する


環境


  • Ruby on Rails 4.2 -> 5.2

  • Ruby 2.5.1


手順



  1. rails new xxx コマンドでプロジェクトを作成する

  2. 旧アプリの config/database.yml の内容を新アプリにコピペする

  3. 旧アプリのモデルを全て rails g model xxx コマンドで生成する(カラム設定は不要)

  4. 自動生成されたマイグレーションファイルを削除する

  5. 旧アプリの db/schema.rb を新アプリの db/migrations/ ディレクトリ配下にコピーする

  6. DBの schema_migrations を見て、最新のタイムスタンプを上記のファイル名の先頭に付け、適当なファイル名に変更する(例: 20180401100000_create_initial_database.rb など)

  7. ファイル名に合わせてマイグレーションファイルのクラス名を編集し、 ActiveRecord::Migration の末尾に旧バージョン [4.2] を付ける。あと def change ~ end も追加する。


  8. rails db:migrate を実行して schema.rb を生成する


解説


  • Railsは rails db:migrate 実行時にマイグレーションファイルのタイムスタンプをDBのschema_migrations内レコードと照合し、ファイル名のタイムスタンプがまだDBに登録されていなければ、マイグレーションを実行する。

  • そのため既にDBに登録済みのタイムスタンプをマイグレーションファイルのファイル名に付けておけば実行されない。