2017-01-10 20 views
1

複数の PostgreSQLデータベース接続を使用して、複雑なデータインポートタスクを実行しています。特定の条件下で、ActiveRecord::StatementInvalid例外が発生した場合は、の特定のデータベース接続でロールバックを実行する必要があります。ActiveRecord :: StatementInvalid例外からActiveRecord :: Connectionインスタンスを取得できますか?

例外として、ActiveRecord::Connectionインスタンスを取得できないようです。私が得ることができるのはPG::Connectionのインスタンスで、exception.cause.connectionです。残念ながら、ロールバックを正しく実行し、内部ARデータ構造をデータベースと同期させておくためには、ActiveRecordインスタンスが必要です。少なくとも、手動でロールバックを実行するには、最後のセーブポイントの名前が必要です(もしあれば)。

ActiveRecord::ConnectionインスタンスをActiveRecord::StatementInvalid例外からどうやって取得できますか?

+0

あなたは、複数のクライアントを使用していたり​​、どのようにクライアント(複数)を経由して接続を区別していますか? – Anthony

+0

クライアントは1つだけですが、モデルクラスの複数の接続、つまり「MyModel.establish_connection」と「MyModel.remove_connection」 –

答えて

0

誰かがこれを必要とする場合は、ここに私のソリューションを掲載しています。

本質的には、すべてのプールからすべての接続を検索して、低レベルの接続が自分の接続と一致するかどうかをチェックするだけです。

def ar_connection_from_pg_connection(pg_conn) 
    ActiveRecord::Base.connection_handler.connection_pools.each do |pool| 
    conn = pool.connections.find { |ar| ar.raw_connection == pg_conn } 
    return conn if conn 
    end 
    nil 
end 
関連する問題