首页 文章

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

提问于
浏览
13

My environment: Ruby 1.9.2p290,Rails 3.0.9和RubyGem 1.8.8

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

The situation is this: 我有两个模型连接两个不同的数据库,并 Build 彼此之间的关联 . 在每个模型中指定数据库连接,看起来像

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 patients . id IS为空

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

5 回答

  • 2

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

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

  • 10

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

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

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

  • 7

    甚至

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

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

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

  • 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 .

相关问题