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

Man*_*han 13 database join ruby-on-rails

我的环境: 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
Run Code Online (Sandbox Code Playgroud)

遇到以下情况时我遇到了错误

@visits = Visit.joins(:patient)
Run Code Online (Sandbox Code Playgroud)

错误:Mysql2 ::错误:表'lab.patients'不存在:SELECT visits.*FROM visitsINNER JOIN patientsON patients.id一片空白

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

小智 10

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

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


小智 7

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

  def self.table_name_prefix
    "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."
  end
Run Code Online (Sandbox Code Playgroud)

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