ruby - ActiveRecord同一模型的多个数据库

时间:2014-08-10 16:55:57

标签: ruby-on-rails ruby sql-server activerecord multiple-databases

我们有一个供应商提供的应用程序,它使用MSSQL数据库作为后端。 我们有这个应用程序的多个实例,因此有多个数据库/数据库服务器托管相同的数据库模型但具有不同的数据。

我正在尝试开发一个非常简单的“浏览工具”来提供所有这些数据库的单一视图(只读)。

我正在使用Sinatra / ActiveRecord / ActiveRecord-SqlServer-Adapter,我的模型被重载以符合数据库模型。

我现在正在寻找的方法是一次请求所有数据库并汇总所有结果。

有没有办法在vanilla ActiveRecord中执行此操作?用宝石? 我发现db-charmer宝石做了类似的事情,但它只与MySQL兼容,无论如何我都无法让它工作。

有什么想法吗?

3 个答案:

答案 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