1

この移行があるとします:

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と、トランザクションがロールバックすることはありませんか? ただし、列とインデックスは残ります。

これを処理する適切な方法は何ですか?

4

1 に答える 1

0

もう 1 つの方法は、ActiveRecord::Rollback 例外を発生させて手動でロールバックすることです。

raise ActiveRecord::Rollback

ロールバックしたいとき。

于 2013-10-01T02:02:43.343 に答える