Rails 3 – 具有连接条件的多个数据库

我的环境: Ruby 1.9.2p290,Rails 3.0.9和RubyGem 1.8.8

不幸的是,遇到多个数据库时我遇到了问题。

情况是这样的:我有两个模型连接两个不同的数据库,并建立彼此之间的关联。 在每个模型中指定数据库连接,看起来像

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

这里’病人’表在’主’数据库和’实验室’数据库中的’访问’表我怀疑执行代码时,Rails正在考虑’病人’表是’实验室’数据库[持有’访问’表的一部分]。

好吧,我不知道这是否是最优雅的解决方案,但我确实通过定义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 

在指定连接条件时,我仍在处理所有细节,但我希望这会有所帮助。

做这样的事情可能更干净:

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

这将从database.yml文件中提取相应的数据库名称

你的第二个数据库在另一台机器上? 你总是可以按照其他问题的建议去做:

MySQL – 使用Python在不同服务器上的数据库之间连接?

甚至

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

我会使用其他人提出的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