在不使用块的情况下回滚事务

时间:2012-10-01 14:21:32

标签: ruby-on-rails activerecord

  

注意:这是Optimising Rspec Tests to Avoid Repeating Complex Setup Proceedures

的后续问题

由于超出此问题范围的原因(请参阅上面的注释),我希望能够启动Rails数据库事务,然后在不同的范围内回滚该事务。 E.g:

def before_callback
  start_transaction # Start the transaction
  # Create/Update some records
end

def after_callback
  rollback_transaction # Rollback changes from before_callback and do_stuff
end

def do_stuff
  before_callback
  # Do some stuff
  after_callback
end

do_stuff

我意识到这是一个人为的例子,可以通过transaction do .. end轻松解决并进行一些重构,但在上下文中请记住do_stuff是外部插件的一部分我真的不知道想要搞砸。有没有办法做类似于我在Rails中描述的内容?

1 个答案:

答案 0 :(得分:4)

对于粗略的快速解决方案,您可以直接在数据库连接上执行所需的SQL命令:

def start_transaction
  ActiveRecord::Base.connection.execute("BEGIN")
end

def rollback_transaction
  ActiveRecord::Base.connection.execute("ROLLBACK")
end

另外,查看transaction方法的来源可能会给您一些关于如何以更精细的方式处理此问题的想法。

(您可以在ActiveRecord::ConnectionAdapters::DatabaseStatements中的lib/active_record/connection_adapters/abstract/database_statements.rb

中找到它