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

7

我已阅读了很多关于这个主题的现有问题/线程,但请记住,没有一个直接解决了我的问题。同时请注意,这不是一个适用于database.yml的情况,因为我事先不知道DB信息。

话虽如此,我需要一个解决方案,可以在Rails应用程序中动态连接到多个数据库。我的情况是,我有多个数据记录站点,所有站点都有一个简单的数据表(EVENTS,TIMESTAMP,VALUE)。由于需要使用本地应用程序,因此这些站点需要保持原样。

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

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

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

如果站点之间距离较远,建立连接可能会非常耗费资源。考虑使用抽取-转换-加载的方法,并使用每小时/每日的定时任务将数据复制到集中式报告网站,这是数据仓库最基本的形式,也是非常常用的方法。如果您正在使用 MySql,则 Maatkit Sync 是一款很棒的小工具,类似于表格的 rsync。或者您可能使用支持主从复制的数据库,尽管这可能需要更多的维护工作。


实际上,我创建了一个简单连接到数据库的类。它似乎运行得很好。不幸的是,一旦部署,就不会有“标准”的数据库集--它将完全取决于用户。此外,由于数据的性质,“仓库”方法行不通。记录的数据不足以指示数据源,并且存在大量数据重复的潜在风险。因此,每个“手动”连接都应该是短暂的,并允许临时提取(但不保留)数据。顺便说一句,非常好的帖子。谢谢。 - humble_coder

0

Rails目前还不支持多个数据库(也许永远不会),你需要在ActiveRecord中某种方式上劫持数据库连接来实现这个模型。

这里是ActiveRecord的文档,而这里则是你需要覆盖的具体文档。

这篇文章真的很好地解释了这个过程。

也有一些半成品的项目正在解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接