动态地将模型连接到运行应用程序中的数据库?
-
12-09-2019 - |
题
我已经阅读了有关此主题的许多现有问题/线程,但请记住 没有任何 他们中有直接解决了我的问题。还要记住这是 不是 我不知道数据库的情况。
也就是说,我需要一个解决方案 动态 连接到Rails应用程序中的多个数据库。我的情况是我有多个数据记录网站,所有这些网站都具有简单的数据表(事件,时间戳,值)。这些站点需要(并将)保留,因为它们是由于需要使用它们的本地应用程序所致。
我需要的是创建一个维护“ MySQL_Logins”表的应用程序,并使用每个登录名来连接到各种数据库中的任何一个,并为其数据提供图表/图。
对于我连接的所有MySQL数据库,我的“数据”模型将保持不变,我只需要告诉我的模型即时连接到其他DB即可。我希望这很简单,但是我们会看到。
解决方案
你要 Activerecord ::基础#starmet_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。或者,您可能会使用支持主奴隶复制的数据库,尽管它可以更加复杂地维护。
不隶属于 StackOverflow