2011-11-01 72 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首次类被加载。