0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rubocopで「Rails/BulkChangeTable: You can use change_table :テーブル名, bulk: true to combine alter queries.」と指摘された時の対処法

Last updated at Posted at 2025-05-14

はじめに

今回躓いた内容の備忘録として、また他にも困った方がいた時の手助けになればと思い記事を作成しました。

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を使って書こうと思います。

参考にしたサイト

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?