LoginSignup
0
2

マイグレーションファイルを修正する際にredoを使うことが便利すぎる件について

Posted at

今までのやり方

今までは、一度そのファイルを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を使って編集した場合はエラーが出るので、その時は新たにマイグレーションファイルを作成すること

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2