2011-11-01 6 views
13

私の環境加わり:ルビー1.9.2p290を、複数のデータベースに遭遇したときに3.0.9と1.8.8 RubyGemRailsの3 - を持つ複数のデータベースが条件

が、残念ながら、私は問題を持っているレール。

状況は次のとおりです。私は2つのモデルを2つの異なるデータベースに接続し、お互いに関連付けを確立しています。各モデルに指定 データベース接続は、見た目は私はエラーを得た

class Visit < ActiveRecord::Base 
    self.establish_connection "lab" 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    self.establish_connection "main" 
    has_many :visits 
end 

好きな時に会う次のシナリオ

@visits = Visit.joins(:patient) 

エラー:Mysql2 ::エラー:テーブル「lab.patients」が存在しません。 SELECT visits。* FROM visits INNER JOIN patients ON patientsid IS NULL

ここで 'patients'テーブルは 'main'データベースと 'lab'データベースの 'visits'テーブルにあります Railsは 'patients'テーブルが 'lab'の一部であると考えているので、データベース[訪問者]テーブルを保持するデータベース

+0

詳細については、[Issue#539](https://github.com/rails/rails/issues/539)を参照してください。 – cweston

答えて

9

まあ、私は知らないが、私は、これは明示的にデータベースを返すためにself.table_name_prefixを定義することによって動作するように手に入れました名。

class Visit < ActiveRecord::Base 
    def self.table_name_prefix 
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV'] 
    (renv.empty? ? "lab." : "lab_#{renv}.") 
    end 

    self.establish_connection "lab" 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    def self.table_name_prefix 
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV'] 
    (renv.empty? ? "main." : "main_#{renv}.") 
    end 

    self.establish_connection "main" 
    has_many :visits 
end 

それが結合条件を指定することになると私はまだすべての詳細を通じて働いているが、私はこのことができます願っています。あなたのdatabase.ymlファイルから適切なデータベース名を引っ張ってくる

def self.table_name_prefix 
    "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}." 
    end 

+0

これは、2つのデータベースが同じマシン上にある場合に移動する方法です。よくやった。 –

+0

ありがとうございました。 - srosenhamer –

+0

http://apidock.com/rails/ActiveRecord/Base/table_name_prefix/class – s2t2

2

2番目のデータベースは別のマシンにありますか?この他の質問で提案されているように、いつでも行うことができます。これは最もエレガントなソリューションである場合

MySQL -- Joins Between Databases On Different Servers Using Python?

+0

いいえ、両方のデータベースは同じマシンにあります。訪問と患者を別々に呼び出すとき、Railsは適切なデータベースに見えます。 'visits = Visit.first.patient'そしてその逆もうまくいきます。両方のモデルを結合するときにのみ問題。 –

7

このような何かをきれいに可能性がありますself.table_name_prefix他の人に提案されていますが、あなたはこれをもう少しきれいに定義することができます:

self.table_name_prefix "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}." 

代わりに、あなたはまた、これを使用することもできます。

self.table_name_prefix "#{connection.current_database}." 

あなたは、後者は、クエリSELECT DATABASE() as dbにクラスがロードされた最初の時間を実行されることを心に留めておく必要があります。

1

あるいは

def self.table_name_prefix 
    self.connection.current_database+'.' 
end 
関連する問題