将模型动态连接到正在运行的应用程序中的数据库?

hum*_*der 7 ruby activerecord ruby-on-rails multiple-databases

我已经在这个问题上阅读许多存在的问题/线程,但请记住,没有人有直接的向我的问题.另请注意,这不是 database.yml的情况,因为我不会事先知道DB信息.

也就是说,我需要一个DYNAMICALLY连接到Rails应用程序中的多个数据库的解决方案.我的情况是我有多个数据记录站点,都有一个简单的数据表(EVENTS,TIMESTAMP,VALUE).由于需要使用它们的本地应用程序,这些站点需要(并且将)保留原样.

我需要的是创建一个维护一个"MYSQL_LOGINS"表的应用程序,并使用这些登录中的每一个连接到各种数据库中的任何一个,并为其中的数据提供图表/图形.

对于我连接的所有MySQL数据库,我的"数据"模型将保持不变,我只需要能够告诉我的MODEL即时连接到不同的数据库.我希望这非常简单,但我们会看到.

Jas*_*ins 15

你想要ActiveRecord :: Base#establish_connection.您可能希望在抽象子类中使用它,以便使用手动连接的模型不会干扰应用程序其余部分的连接使用:

class LogBase < ActiveRecord::Base
  self.abstract_class = true
end

class LogItem < LogBase
  ...
end

LogItem.establish_connection { ... }

LogItem.find_by_ ...
Run Code Online (Sandbox Code Playgroud)

如果您只有一个进行手动连接的模型,则不需要抽象类.

您是否知道可能连接到的完整数据库集?如果是这样,database.yml可能仍然对您有用.您可以将所有信息作为目录放入其中,为每个数据库命名,然后使用这些名称动态选择与应用程序中的哪个建立连接:

# database.yml
atlanta:
  host: atlantadb.foo.com

# foo.rb
LogItem.establish_connection :atlanta
Run Code Online (Sandbox Code Playgroud)

如果网站被广域网分开,建立连接可能非常重要,加倍.我会考虑使用提取 - 转换 - 加载方法并使用每小时/每日cron作业将数据复制到集中报告站点是否更有意义.这是数据仓库的最基本形式,是一种非常常用的方法.如果您正在使用MySql,Maatkit Sync是一个简洁的小工具,如表格的rsync.或者,您可能使用支持主从复制的数据库,但维护起来要复杂得多.