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 - 具有连接条件的多个数据库的主要内容,如果未能解决你的问题,请参考以下文章