我可以从ActiveRecord :: StatementInvalid异常中获取ActiveRecord :: Connection实例吗?

时间:2017-01-10 14:01:31

标签: ruby-on-rails ruby activerecord

我正在使用多个 PostgreSQL数据库连接执行复杂的数据导入任务。在某些情况下,如果遇到ActiveRecord::StatementInvalid异常,我需要在特定的数据库连接上执行回滚。

我似乎无法从该异常中获取ActiveRecord::Connection实例。我能得到的是来自PG::Connection的{​​{1}}个实例。不幸的是,我需要ActiveRecord实例来正确执行回滚并使内部AR数据结构与数据库保持同步。至少我需要最后一个保存点的名称(如果有的话)来执行手动回滚。

如何从exception.cause.connection例外中获取ActiveRecord::Connection个实例?

1 个答案:

答案 0 :(得分: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