2011-11-01 47 views
13

我的環境:紅寶石1.9.2p290來說,Rails 3.0.9和1.8.8 RubyGemRails 3中 - 與多個數據庫連接狀態

不幸的是我有一個問題在多個數據庫來當。

情況是這樣的:我有兩個模型連接兩個不同的數據庫,並且還建立了彼此之間的關聯。 數據庫連接指定每個模型,看看喜歡

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。*從visits INNER JOIN patients ON patientsid IS NULL

這裏的病人的表是「主」數據庫和「訪問」在「實驗室」數據庫 表執行代碼時,Rails所正在考慮「病人」表我懷疑是「實驗室」的組成部分數據庫[其中包含'訪問'表]。

+0

有關更多信息,請參見[問題#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 

當談到指定連接條件時,我仍在研究所有細節,但我希望這有助於。

+0

如果兩個數據庫位於同一臺計算機上,這就是要走的路。做得好。 –

+0

感謝您提供工作解決方案。 - srosenhamer –

+0

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

2

您的第二個數據庫是否在另一臺機器上?你總是可以做到在這個問題的其他建議:

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

+0

否。兩個數據庫都在同一臺機器上。分別調用訪問和Patient時,Rails會查找適當的數據庫。 '訪問= Visit.first.patient',反之亦然。只有在加入兩個模型時纔有問題 –

7

可能是清潔劑做這樣的事情:

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

將從您的database.yml文件拉動相應的數據庫名稱

1

甚至

def self.table_name_prefix 
    self.connection.current_database+'.' 
end 
0

我會使用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首次類被加載。