はじめに
今回躓いた内容の備忘録として、また他にも困った方がいた時の手助けになればと思い記事を作成しました。
rubocopの指摘内容
rubocopをかけるとこのように表示されました。
db/migrate/20250507114656_add_column_to_user.rb:5:5:
C: Rails/BulkChangeTable: You can use change_table :users, bulk: true to combine alter queries.
add_column :users, :self_introduction, :text
これは、「change_tableにbulk: trueオプションをつけて一括で変更してね」ということを示しています。
対処法
①マイグレーションファイルの状態とIDを確認する
このコマンドを打つと、現在のマイグレーションファイルの状態(UP/DOWM)や、マイグレーションファイルごとのIDをみることができます。
$ rails db:migrate:status
②特定のマイグレーションファイルをDOWNの状態にする
Migration IDに編集したいマイグレーションファイルのMigration IDをコピーしてコマンドを実行してください。
$ rails db:migrate:down VERSION=Migration ID
今回はこのようにしました。
$ rails db:migrate:down VERSION=20250507114656
そうするとDOWN状態になっていると思います。
③マイグレーションファイルを編集する
Railsのmigrationで1つのテーブルについて複数の操作をする時に、このように個別に書くのではなく、
class AddColumnToUser < ActiveRecord::Migration[7.0]
def change
add_column :users, :self_introduction, :text
add_column :users, :place, :string
add_column :users, :website, :text
end
end
change_tableにbulk: trueオプションをつけてまとめましょう、というCopなので、このように変更します。
また、「:bulk」オプションをつけることで、変更内容を1つのALTER TABLE文にまとめることができます。
class AddColumnToUser < ActiveRecord::Migration[7.0]
def change
change_table :users, bulk: true do |t|
t.text :self_introduction
t.string :place
t.text :website
end
end
end
・使い方はこちらを参照:change_table | Railsドキュメント
こうすることで個別に実行されていたALTER TABLE文が
ALTER TABLE "users" ADD "self_introduction" text
ALTER TABLE "users" ADD "place" character varying
ALTER TABLE "users" ADD "website" text
まとめて実行されるようになって処理が高速化されます。
ALTER TABLE "users" ADD "self_introduction" text, ADD "place" character varying, ADD "website" text
④rails db:migrateコマンドを実行する
ターミナルに
$ rails db:migrate
と打ってください。編集したマイグレーションファイルをUPにします。
これでマイグレーションファイルの編集が完了!
注意
こちらの方法(ロールバック)を行うと、該当のテーブルのデータが消えてしまいます(マイグレーションをupの状態からdownの状態にするとテーブルが削除される。)。ですので、本番環境などで消えて欲しくないデータが保存されている場合は基本的には使わない方が良いです。
おわりに
今後、テーブルにカラムを複数追加する際は、add_columnを何度も重ねずに、change_tableを使って書こうと思います。
参考にしたサイト