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

Posted

技术标签:

【中文标题】Rails 3 - 具有连接条件的多个数据库【英文标题】:Rails 3 - Multiple database with joins condition 【发布时间】:2011-12-19 13:45:35 【问题描述】:

我的环境: 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::Error: 表 'lab.patients' 不存在:SELECT visits.* FROM visits INNER JOIN patients ON patients.id IS NULL

这里的“患者”表在“主”数据库中,“访问”表在“实验室”数据库中 我怀疑在执行代码时,Rails 是否认为“患者”表是“实验室”数据库的一部分 [其中包含“访问”表]。

【问题讨论】:

更多信息请见Issue #539 【参考方案1】:

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

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

【讨论】:

如果两个数据库在同一台机器上,这是要走的路。干得好。【参考方案2】:

这样做可能会更干净:

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

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

【讨论】:

【参考方案3】:

甚至

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

【讨论】:

【参考方案4】:

您的第二个数据库是否在另一台机器上?您始终可以按照其他问题中的建议进行操作:

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

【讨论】:

没有。两个数据库都在同一台机器上。当分别调用访问和患者时,Rails 看起来合适的数据库。 'visits= Visit.first.patient' 反之亦然。只有在加入两个模型时才会出现问题。【参考方案5】:

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

【讨论】:

以上是关于Rails 3 - 具有连接条件的多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

多条件内连接r数据表

具有多个条件的数据表选择

Rails 连接多个数据库的两种方式

Rails 在连接表上加入条件

具有多个连接条件的实体框架查询

LINQ:具有多个条件的左外连接