7

我已经阅读了许多关于这个主题的现有问题/主题,但请记住,它们都没有直接解决我的问题。另请记住,这不是database.yml 的情况,因为我不会提前知道数据库信息。

也就是说,我需要一个解决方案来动态连接到 Rails 应用程序中的多个数据库。我的情况是我有多个数据记录站点,所有站点都有一个简单的数据表(事件、时间戳、值)。由于需要使用它们的本地应用程序,这些站点需要(并且将)保持原样。

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

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

4

2 回答 2

15

你想要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 作业将数据复制到集中报告站点是否更有意义。这是数据仓库的最基本形式,也是一种非常常用的方法。如果您使用的是 MySql,Maatkit Sync是一个简洁的小工具,例如用于表的 rsync。或者,您可能使用支持主从复制的数据库,尽管维护起来可能要复杂得多。

于 2009-06-12T14:35:01.770 回答
0

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

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

确实很好地解释了这个过程。

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

于 2009-06-08T18:45:36.370 回答