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

另一种方法是通过引发 ActiveRecord::Rollback 异常手动回滚。

raise ActiveRecord::Rollback

当你想回滚时。

于 2013-10-01T02:02:43.343 回答