我正在尝试将ActiveRecord gem升级到最新的3.1.0版本并看到引发了很多异常,我认为这是由于我们如何处理多个数据库.
对于我们的每个数据库,我们指定一个单独的基类,它继承自那里ActiveRecord::Base并establish_connection在其中调用.没有跨数据库关系.到目前为止,这对我们来说运作良好.
升级到ActiveRecord 3.1.0后,我发现它ActiveRecord::ConnectionNotEstablished在遍历关系时会出现异常(即它会成功从数据库中提取单个实体或一组,但在导航到相关类时失败).
回溯的顶线是C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in 'retrieve_connection',所以我稍微挖了一下.该方法定义如下:
def retrieve_connection(klass) #:nodoc:
pool = retrieve_connection_pool(klass)
(pool && pool.connection) or raise ConnectionNotEstablished
end
Run Code Online (Sandbox Code Playgroud)
我的简单test(puts Customer.first.address)调用了retrieve_connection3次.两次Customer作为klass参数,一次ActiveRecord::Base作为参数 - 当它失败时,因为establish_connection没有被调用ActiveRecord::Base.
那么实际的问题是 - 在ActiveRecord中有一种新的推荐方法来处理多个数据库连接吗?如果是这样,它是什么?
如果没有,可能导致这个问题的原因是什么?
小智 9
昨天我在升级到ActiveRecord 3.1.0时遇到了同样的问题.我不能说在ActiveRecord 3.1中是否有一种新的推荐方法来处理多个数据库连接,但我确实找到了解锁自己的方法.
现在似乎必须在ActiveRecord :: Base上建立连接,以便它确定适配器的表名长度/规则.除了在我的数据库初始化程序中建立的其余连接外,我现在还为我的一个DB建立了一个ActiveRecord :: Base连接(哪个连接无关紧要).
我想有一个更好的解决方案可以找到,但我现在很高兴能够畅通无阻.