我们有一个供应商提供的应用程序,它使用MSSQL数据库作为后端。 我们有这个应用程序的多个实例,因此有多个数据库/数据库服务器托管相同的数据库模型但具有不同的数据。
我正在尝试开发一个非常简单的“浏览工具”来提供所有这些数据库的单一视图(只读)。
我正在使用Sinatra / ActiveRecord / ActiveRecord-SqlServer-Adapter,我的模型被重载以符合数据库模型。
我现在正在寻找的方法是一次请求所有数据库并汇总所有结果。
有没有办法在vanilla ActiveRecord中执行此操作?用宝石?
我发现db-charmer
宝石做了类似的事情,但它只与MySQL兼容,无论如何我都无法让它工作。
有什么想法吗?
答案 0 :(得分:1)
我终于找到了一个我能够破解我需要的宝石。
我使用了Octopus
及其分片功能,我在我的基本控制器类中添加了一个简单的方法(我所有其他控制器都基于它),如下所示:
def on_all_shards(&block)
Octopus.config[:shards].each.collect do |shard, shard_config|
Octopus.using(shard) do
yield
end
end
end
然后在我的控制器中,只要我需要聚合所有分片的结果:
on_all_shards do
Model.first
end
在这种情况下,我会从每个数据库(1个记录/数据库)中获取此Model /表的第一条记录的数组。
谢谢你们指点我正确的方向(ActiveRecord connection / connection_pool管理)!
答案 1 :(得分:0)
这不是您问题的具体答案,但可能会帮助您
-
<强>模型强>
我们最近一直在使用multi-tenancy系统,需要访问多个数据库
&#34;方式&#34;要做到这一点实际上相当简单 - 但只有你想在模型级别进行。别的什么&amp;抱歉,你已经失去了我。
在模型级别,每次初始化对象的实例(IE加载model
)时,Rails将访问数据库,并因此使用所需的属性填充ruby对象。 A&#34;技巧&#34;制作多租户系统(具有多个数据库连接)是从不同模型继承
以下是一个例子:
#app/models/option.rb
Class Option < Admin
...
end
#lib/admin.rb
Class Admin < ActiveRecord::Base
self.abstract_class = true
establish_connection "#{Rails.env}_admin"
end
#config/database.yml
production_admin:
your: ____
database: ____
values: ____
这允许您连接到Option
模型的其他数据库;为您提供加载各种文件/设置以使其正常工作的能力
虽然我不认为这会直接解决您的问题(您希望同时访问多个数据库),但我希望它会给您一个想法
-
<强>数据库强>
这里的底线是,如果您想同时连接到多个数据库,您可能希望查看为模型识别数据库,然后在模型中设置连接类型。
我不确定您是否尝试将数据加载到不同的模型对象或同一个模型对象中。如果它通过多个对象,您可能能够完成我上面提到的内容,根据需要动态设置数据库
-
所有我都害怕
答案 2 :(得分:0)
如果您有所有连接的列表,您可以执行类似
的操作connection_specs.collect do |spec|
Model.establish_connection(spec)
Model.all
end
或在某处初始化一些基类
db_klasses = connection_specs.collect do |spec|
Class.new(ActiveRecord::Base) do
establish_connection(spec)
end
end
然后
db_klasses.collect do |db_klass|
db_klass.connection_pool.with_connection do
Model.all
end
end