今までのやり方
今までは、一度そのファイルをrail db:rollbakやrails db:migration:downを使ってステータスのdownを確認したのちにマイグレーションファイルに変更を加えて再度rails db:migrateでupさせてschemaに反映させていた。
例えば新しくusersテーブルにaddressというカラムを追加する時は以下のような手順でやっていた
1.rails db:migrate:status
でdownしたいマイグレーションファイルの状況を確認する
Status Migration ID Migration Name
--------------------------------------------------
up 20230815080323 Create tasks
up 20230817012833 Add expiry date to tasks
up 20230817014502 Remove expiry date from tasks
up 20230817023012 Add expired at to tasks
up 20230817062638 Add status to tasks
up 20230819041152 Add priority to tasks
up 20230819144335 Add index tasksnot started yet
up 20230819144533 Remove not started yet to tasks
up 20230819144709 Add index tasks not started yet
up 20230821020042 Create users
2.今回はusersテーブルにaddressカラムを追加したいので一番下のCreate usersをdownにする必要があるためrails db:rollback
を実行する
rollback後のstatusは以下の通り
Status Migration ID Migration Name
--------------------------------------------------
up 20230815080323 Create tasks
up 20230817012833 Add expiry date to tasks
up 20230817014502 Remove expiry date from tasks
up 20230817023012 Add expired at to tasks
up 20230817062638 Add status to tasks
up 20230819041152 Add priority to tasks
up 20230819144335 Add index tasksnot started yet
up 20230819144533 Remove not started yet to tasks
up 20230819144709 Add index tasks not started yet
down 20230821020042 Create users
Create usersがdownになっていることがわかる
3.downした、マイグレーションファイルに直接書き込みaddressカラムを追加する
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.string :email
t.string :password_digest
t.string :address # 追加
t.timestamps
end
end
end
4.rails db:migrate
を実行してupさせるとともに、schemaにも反映させる
schemaは以下の通り
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.string "password_digest"
t.string "address"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
redoを使ってaddressカラムを追加する手順は以下の通り
1.マイグレーションファイルがup状態であることを確認する
Status Migration ID Migration Name
--------------------------------------------------
up 20230815080323 Create tasks
up 20230817012833 Add expiry date to tasks
up 20230817014502 Remove expiry date from tasks
up 20230817023012 Add expired at to tasks
up 20230817062638 Add status to tasks
up 20230819041152 Add priority to tasks
up 20230819144335 Add index tasksnot started yet
up 20230819144533 Remove not started yet to tasks
up 20230819144709 Add index tasks not started yet
up 20230821020042 Create users
2.up状態のままusersのマイグレーションファイルを表示する
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.string :email
t.string :password_digest
t.timestamps
end
end
end
3.このマイグレーションファイルに直接addressカラム追加に必要な情報を書き込む
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.string :email
t.string :password_digest
t.string :address #addressカラムを追加
t.timestamps
end
end
end
4.rails db:migrate:redo
を実行し、schemaファイルを確認する
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.string "password_digest"
t.string "address"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
上記のようにaddressカラムがusersテーブルに反映されていることが確認できる
まとめ
redoを使うことでいちいちマイグレーションファイルを生成したり、既存のマイグレーションファイルのステータスををdownにしたりせずにマイグレーションファイルがupの状態でもredoを使うことでカラムの追加や、削除、カラム名の修正ができる。また、VERSIONを指定してあげることで、前に作ったマイグレーションファイルも追加、削除、編集ができる
注意
リレーションで紐付けられたテーブルをredoを使って編集した場合はエラーが出るので、その時は新たにマイグレーションファイルを作成すること