我的环境: 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 patients
。{ {1}} IS NULL
此处'患者'表位于'主'数据库中,'访问'表位于'实验室'数据库中 我怀疑在执行代码时,Rails正在考虑'患者'表是'实验室'数据库[持有'访问'表]的一部分。
答案 0 :(得分: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
在指定连接条件时,我仍在处理所有细节,但我希望这会有所帮助。
答案 1 :(得分:7)
做这样的事可能更干净:
def self.table_name_prefix
"#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."
end
这将从database.yml文件中提取相应的数据库名称
答案 2 :(得分:3)
甚至
def self.table_name_prefix
self.connection.current_database+'.'
end
答案 3 :(得分:2)
你的第二个数据库在另一台机器上吗?你总是可以按照其他问题的建议去做:
MySQL -- Joins Between Databases On Different Servers Using Python?
答案 4 :(得分: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
。