2017-03-10 3 views
1

私はマスターをオフロードするために、いくつかのreadonly呼び出しを送るレプリカデータベーススレーブを実行しています。この理由から、私はいくつかのクエリをオフロードする必要があるときはいつでも、それらを使用できるように、そのデータベースに別々に接続する2つのカスタムモデルを作成したいと思います。Railsはクラス間のカスタムデータベース接続を共有します - クラス継承なし?

私は2つのクラスがあります。

class Car < ActiveRecord::Base 
    has_many :prices 
end 

class Price < ActiveRecord::Base 
    belongs_to :car 
end 

Railsは、このようなモデルレベルのカスタムデータベース接続を共有する可能性があります。

class MyCustomDbConnection < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection({database: 'www.slavedb.com', port: 5432, pass: 'some'}) 
end 

class ReadonlyCar < MyCustomDbConnection 
end 

class ReadonlyPrice < MyCustomDbConnection 
end 

これはうまく動作しますが、私のユースケースは、私はだろうということですまた、'ReadonlyCar 'とReadonlyPriceは、デフォルトのActiveRecord::Base.connectionを使用する元のモデルから継承したいと思っています。これは、ReadonlyCarが元のものと全く同じように動作するために必要ですCar(ビジネスロジック)。今度はReadonlyCar < MyCustomDbConnectionReadonlyCar < Carの両方からクラス継承を同時に行うことはできません。Carから完全な機能を得るにはどうすればいいですか?ReadonlyCarReadonlyPriceの間でスレーブと同じ接続を共有しますか?

答えて

2

あなたは接続を確立するためにその呼び出しを含むインクルードフックのモジュールを書くことができます。

module MyCustomDbConnection 
    def self.included(base) 
    base.establish_connection(
     database: 'www.slavedb.com', 
     port: 5432, 
     pass: 'some' 
    ) 
    end 
end 

class ReadOnlyCar < Car 
    include MyCustomDbConnection 
end 
+0

グレート、私はそれが実際に同じ接続を使用して、そしてちょうど新しい接続を作成していないことを、私がしなければ 'ReadonlyCar.first?'と 'ReadonlyPrice.first'ことを、確認することができますどのように任意のアイデア? –

+0

含まれているフックは、モジュールがどこかに含まれるたびに実行されます。あなたのケースでは 'establish_connection'は' base'が 'ReadonlyPrice'で、' base'が 'ReadonlyCar'で一度呼び出されます。あなたはちょうど1つの接続をしたいですか?もしそうなら、シングルトンを使う必要があります。これがあなたが実際に達成したかったものなら、私は自分の答えを広げることができます。 – kaikuchn

+0

ええ、アイデアは、私が接続したいと思っていないということです。 'ReadonlyCar.first.prices.first.car' –

関連する問題