学び

changeをdownする際のremove_index、remove_columnは遅延実行されるので、追加したカラムに更新処理を行なっていてもエラーにならない。

検証

実行するmigration

カラムを追加する、かつ追加したカラムの値を更新する。

class AddSequenceToHoges < ActiveRecord::Migration[6.1]
  def change
    add_column :hoges, :sequence, :integer, after: :content, comment: '表示順'
    add_index :hoges, [:company_important_meeting_id, :sequence]

puts "Hoge.count: #{Hoge.count}"
    Hoge.find_each do |hoge|
puts "hoge in loop"
      hoge.update_column(:sequence, 1)
    end
  end
end

up時

add_column → add_index → 更新処理と、呼び出し順に実行されている。

bundle exec rails db:migrate
== 20240221091903 AddSequenceToHoges: migrating ==
-- add_column(:hoges, :sequence, :integer, {:after=>:content, :comment=>"表示順"})
   -> 0.8408s
-- add_index(:hoges, [:fuga_id, :sequence])
   -> 0.0767s
Hoge.count.count: 1
hoge in loop
== 20240221091903 AddSequenceToHoges: migrated (1.0267s)

down時

更新処理 → remove_index → remove_columnと、upと逆実行になっている。感覚的にはカラムが削除されて、存在しないカラムを更新しようとしてエラーになると思っていた。

bundle exec rails db:migrate:down VERSION=20240221091903
== 20240221091903 AddSequenceToHoges: reverting ==
Hoge.count: 1
hoge in loop
-- remove_index(:hoges, [:fuga_id, :sequence])
   -> 0.0103s
-- remove_column(:hoges, :sequence, :integer, {:after=>:content, :comment=>"表示順"})
   -> 0.0656s
== 20240221091903 AddSequenceToHoges: reverted (0.1504s)