ActiveRecord 3.1.0多个数据库

我正在尝试将ActiveRecord gem升级到最新的3.1.0版本并看到很多exception被提出,我认为这是由于我们如何处理多个数据库。

对于我们的每个数据库,我们指定一个单独的基类,它inheritance自ActiveRecord::Base ,并在那里调用establish_connection 。 没有跨数据库关系。 到目前为止,这对我们来说工作得很好。

升级到ActiveRecord 3.1.0后,我看到它在遍历关系时失败并出现ActiveRecord::ConnectionNotEstablishedexception(即它将成功从数据库中提取单个实体或一组实体,但在导航到相关类时失败)。

回溯的顶行是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 

我的简单测试( puts Customer.first.address )调用retrieve_connection 3次。 使用Customer作为klass参数两次,使用ActiveRecord::Base作为参数一次 – 因为没有因为没有为ActiveRecord::Base调用establish_connection而失败。

那么实际的问题是 – 在ActiveRecord中有一种新的推荐方法来处理多个数据库连接吗? 如果是这样,它是什么?

如果没有,可能导致这个问题的原因是什么?

昨天我在升级到ActiveRecord 3.1.0时遇到了同样的问题。 我不能说在ActiveRecord 3.1中是否有一种新的推荐方法来处理多个数据库连接,但我确实找到了解锁自己的方法。

现在必须在ActiveRecord :: Base上建立连接,以便确定适配器的表名长度/规则。 除了在我的数据库初始化程序中建立的其余连接外,我现在还为我的一个数据库建立了一个ActiveRecord :: Base连接(哪个连接无关紧要)。

我想有一个更好的解决方案可以找到,但我很高兴现在可以畅通无阻。

我正在使用这个解决方案 – 我看到的是当在每个OtherDb类中调用establish_connection时 – 似乎有很多开销重新加载表定义,每次重新加载类def时我都会随机查看问题。

 # The idea here is to specify that a given model should use another # database without having to change the entire inheritance hierarchy # declare model for table in primary connection class Bar < ActiveRecord::Base # assume we have logic here that we don't want to refactor into a module # but we do want to inherit in OtherDb::Bar end module Foo # base model in Foo namespace - uses another db class BaseConnection < ActiveRecord::Base # OtherDb::Title.database contains a db config hash # This would probably go in the initializers establish_connection OtherDb::Title.database end # module used to override db connection module OtherDb::Base def retrieve_connection # connection_handler.retrieve_connection(self) # normal behavior connection_handler.retrieve_connection(Foo::BaseConnection) # use db from Foo::BaseConnection end end # Foo::Bar is identical to ::Bar but is in another db class Bar < ::Bar extend OtherDb::Base end end