2011-09-12 16 views
8

私はActiveRecord gemを最新の3.1.0リリースにアップグレードしようとしていますが、例外が多く発生しているのを見て、私は複数のデータベースをどのように処理するのかと考えています。ActiveRecord 3.1.0複数のデータベース

それぞれのデータベースについて、ActiveRecord::Baseから継承する別の基本クラスを指定し、そこでestablish_connectionを呼び出します。データベース間の関係はありません。これまで私たちのためにうまくいきました。

ActiveRecord 3.1.0にアップグレードしたのですが、ActiveRecord::ConnectionNotEstablished例外が発生しました。関係をトラバースするときに例外が発生します(つまり、1つのエンティティまたはDBのセットが正常に取得されますが、関連するクラス)。

バックトレースの先頭行は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回を呼び出します。 Customerklassパラメータとして2回、パラメータとしてActiveRecord::Baseを1回実行します。これは、失敗するとestablish_connectionが呼び出されていないため、ActiveRecord::Baseとなります。

実際の質問には、ActiveRecordで複数のデータベース接続を処理する新しい方法がありますか?もしそうなら、それは何ですか?

もしそうでない場合は、この問題の原因は何ですか?

答えて

8

私はActiveRecord 3.1.0にアップグレードしているうちに同じ問題を抱えました。私はActiveRecord 3.1で複数のデータベース接続を処理する新しい推奨方法があるのか​​どうかは言えませんが、私は自分自身をブロック解除する方法を見つけました。

アダプタのテーブル名の長さ/ルールを決定するために、ActiveRecord :: Baseに接続を確立する必要があります。データベースのイニシャライザで確立された残りの接続と並んで、私は現在ActiveRecord :: Base接続を自分のDBの1つに設定しています(どのデータベースでも問題ありません)。

もっと良い解決策があると思っていますが、今はブロックされていてうれしいです。

+0

ありがとうございました。まだ試してみる時間はありませんでしたが、良い解決策のようです。あなたがもっと良い方法を見つけたら、私たちに知らせてください。 –

+0

私たちは同じ問題を抱えており、もっと良い解決策を探しています。しかし、助けてくれてありがとう。少なくとも今でもブロックされていません! – jasonkarns

+0

この問題(activerecord 3.1.3)に直面して、問題を解決しました。私はより良い解決策がより理想的であることに同意します。 –

3

私が見ていたのは、Established_connectionがOtherDbクラスのそれぞれで呼び出されたときに、オーバーヘッドがテーブルの定義を再読み込みするように思えたため、クラス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 
関連する問題