この移行があるとします:
class MigrateStuff < ActiveRecord::Migration
def up
add_column :contacts, :receive_newsletter, :boolean, :default => false
add_index :contacts, :receive_newsletter
for t in SomeOtherThing.all
#... do stuff in here
end
end
def down
#...
end
end
そこで、列とインデックスを追加します。次に、いくつかのデータを新しい列に入れます。for
ループの一部が失敗するとどうなりますか? 列/インデックスは削除されません。これをトランザクションに追加しようとしました:
class MoveEmailRecipientsToContacts < ActiveRecord::Migration
def up
Volunteer.transaction do
add_column :contacts, :receive_newsletter, :boolean, :default => false
add_index :contacts, :receive_newsletter
for t in SomeOtherThing.all
#... do stuff in here
end
end
end
def down
#...
end
end
ブロック内で例外が発生するfor
と、トランザクションがロールバックすることはありませんか? ただし、列とインデックスは残ります。
これを処理する適切な方法は何ですか?