はじめに
これは備忘録を兼ねたtipsです。RubyとRailを熟知している方には当たり前でしょうが、私のような使い慣れていない方や忘れてしまった方のために残したものです。
マイグレーションファイルの追加で衝突
Railsは幾つものマイグレーションファイルを追加していけますが、同じ命名法で同じテーブルに対するマイグレーションファイルを追加しようとすると次の実行例のように名前が衝突した(同じだ)として、強制的に置き換えることを勧められます。さて、どうすれば良いのでしょうか?
matthew@app$ rails g migration AddColumnToRobot memo:string
Running via Spring preloader in process 29931
invoke active_record
conflict db/migrate/20190108233655_add_column_to_robot.rb
Another migration is already named add_column_to_robot: /home/matthew/app/db/db/migrate/20190108023819_add_column_to_robot.rb. Use --force to replace this migration or --skip to ignore conflicted file.
$
衝突回避策
マイグレーション機能の実装ソースを見て挙動を予測してからのほうが良いかもしれませんが、直ぐにテストができるなら、試した方が早いということで、マイグレーションファイルを生成するときに命名方法を工夫してみました。二つめのマイグレーションファイルを追加したいということで、末尾に2をつける命名法でマイグレーションファイルを生成させてみました。
matthew@app$ rails g migration AddColumnToRobot2 memo:string
Running via Spring preloader in process 29970
invoke active_record
create db/migrate/20190108234849_add_column_to_robot2.rb
vagrant@robocon:kosen-robocon-db$
編集
マイグレーション・ファイルは問題なく生成されました。ファイル中のクラス名は何でもよいとして、add_column関数の最初の引数に指名しているテーブル名がrobot2sと生成されてしまいました。実在しているテーブルはrobotsですので、これをエディタでrobotsに変更します。
class AddColumnToRobot2 < ActiveRecord::Migration[5.2]
def change
add_column :robot2s, :memo, :string
end
end
マイグレーション実行
マイグレーションを実行した後、db/schema.rbとデータベースで指定のテーブルに指定のカラムが増えたのを確認しました。また、ロールバックも実行してみたところ、元に戻ることを確認できました。
matthew@app$ rails db:migrate
== 20190108234849 AddColumnToRobot2: migrating ================================
-- add_column(:robots, :memo, :string)
-> 0.0153s
== 20190108234849 AddColumnToRobot2: migrated (0.0170s) =======================
vagrant@robocon:kosen-robocon-db$ rails db:rollback
== 20190108234849 AddColumnToRobot2: reverting ================================
-- remove_column(:robots, :memo, :string)
-> 0.2186s
== 20190108234849 AddColumnToRobot2: reverted (0.2519s) =======================
vagrant@robocon:kosen-robocon-db$