不使用区块回滚交易

Aje*_*i32 4 activerecord ruby-on-rails

注意:这是优化 Rspec 测试以避免重复复杂设置程序的后续问题

出于本问题范围之外的原因(请参阅上面的注释),我希望能够启动 Rails 数据库事务,然后在不同的范围内回滚该事务。例如:

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
Run Code Online (Sandbox Code Playgroud)

我意识到这是一个人为的例子,可以通过transaction do .. end一些重构轻松解决,但在上下文中要记住它do_stuff是我真的不想弄乱的外部插件的一部分。有没有办法做一些类似于我刚刚在 Rails 中描述的事情?

Dan*_*ski 6

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

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

def rollback_transaction
  ActiveRecord::Base.connection.execute("ROLLBACK")
end
Run Code Online (Sandbox Code Playgroud)

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

(你可以在ActiveRecord::ConnectionAdapters::DatabaseStatements中找到它lib/active_record/connection_adapters/abstract/database_statements.rb