4

注:これは、複雑なセットアップ手順の繰り返しを回避するための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

transaction do .. endこれは、少しリファクタリングするだけで簡単に解決できる工夫された例だと思いますが、コンテキストではdo_stuff、私が本当にいじりたくない外部プラグインの一部であることを念頭に置いてください。Railsで説明したのと同じようなことをする方法はありますか?

4

1 に答える 1

6

大雑把な手っ取り早い解決策として、必要な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

于 2012-10-01T20:43:09.737 に答える