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

我已经阅读了很多关于这个主题的现有问题/主题,但请记住,他们都没有直接解决我的问题。 另请注意,这不是 database.yml的情况,因为我不会事先知道DB信息。

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

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

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

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

class LogBase < ActiveRecord::Base self.abstract_class = true end class LogItem < LogBase ... end LogItem.establish_connection { ... } LogItem.find_by_ ... 

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

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

 # database.yml atlanta: host: atlantadb.foo.com # foo.rb LogItem.establish_connection :atlanta 

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

Rails不支持开箱即用的多个数据库(可能永远不会,谁知道)。 你必须以某种方式劫持ActiveRecord中针对该模型的数据库连接。

以下是此活动记录文档,以下是您必须覆盖的特定文档 。

这可以很好地解释这个过程。

还有一些半生产就绪的项目正在攻击这个问题。