ruby-on-rails - 不使用区 block 回滚交易

标签 ruby-on-rails activerecord

Note: This is a follow up question to Optimising Rspec Tests to Avoid Repeating Complex Setup Proceedures



出于本问题范围之外的原因(请参阅上面的注释),我希望能够启动 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

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

最佳答案

对于粗略的快速解决方案,您可以直接在数据库连接上执行所需的 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 )

关于ruby-on-rails - 不使用区 block 回滚交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12675128/

相关文章:

ruby-on-rails - 在 View 中显示来自 api 的 JSON 响应

ruby-on-rails - 使用 RSpc 2.9.0 + FactoryGirl 3.2 通过验证测试 has_many

ruby-on-rails - 如何在 Ruby 中处理包含空格的文件名(在 Git Bash 中)

ruby-on-rails - 按钮标签中嵌入的 HTML 标签 Rails Button_to

ruby-on-rails - 如何(大量)减少 Rails 应用程序中的 SQL 查询数量?

javascript - Rails 指定 javascript 文件的加载顺序?

ruby-on-rails - 事件记录 :has_many associations and === operator

ruby-on-rails - 多范围唯一性验证

ruby-on-rails - ActiveRecord : If exists then delete else create 的最佳方式

sql - ActiveRecord:基于关联列的平均值对表进行排序