Rails - 具有多个数据库的相同模型(只读)

时间:2015-08-02 09:39:39

标签: ruby-on-rails database ruby-on-rails-3 model

我有多个数据库,里面有相同的表和列名称(但不同的唯一ID和行......)。它不是拥有一个包含所有行的巨大数据库,而是分成不同的数据库。这是我无法改变的(您可以将其视为从不同国家收集相同的数据,但每个国家/地区都有自己的数据库)。 这些数据库是#34;只读" - 意思是,当我通过Rails使用它们时,它只是显示数据(或将其保存在本地数据库中) - 我不会更改任何远程数据库上的数据。

我的问题是,我需要在rails中有一个模型,它从所有这些数据库中收集数据。我们希望能够做到这样的事情:

OneModelAllDB.select_where(...)

并且不要将每个搜索拆分为:

data1 = FirstDBModel.select_where(same_condition)
data2 = SecondDBModel.select_where(same_condition)
...
data = data1 + data2 + ...

另外,如果我想用线程制作1个模型(并行搜索),则会出现问题:

[:db1, :db2].each do |db|
  threads << Thread.new do
    self.establish_connection(db)
    results[db] = self.where(bla_bla_condition)
  end
end

因为连接的修改不是线程安全的......

有没有办法这样做?由于我们不更改任何这些数据库,并且每行都有唯一的ID,因此从不同的数据库获取数据并将它们连接在一起不应该有任何问题......

谢谢!

1 个答案:

答案 0 :(得分:1)

从数据库连接中抽象出Rails活动记录。连接是单独管理的。你不会有FirstDB.select_where(...)

之类的东西

但是,您可以尝试在config/database.yml中定义不同的数据库,例如:

db1:
  adapter: postgresql
  encoding: unicode
  database: database1
  pool: 5
  username: xxx
  password: xxx

db2:
  adapter: postgresql
  encoding: unicode
  database: database2
  pool: 5
  username: xxx
  password: xxx

然后在您的代码中,您将使用ActiveRecord::Base.establish_connection在运行查询之前重新建立与所需数据库的连接。如果您的活动记录模型名为Foo,则:

Foo.establish_connection(:db1)
data1 = Foo.where(...)

Foo.establish_connection(:db2)
data2 = Foo.where(...)

我自己并没有详细考虑过这个问题,但它应该是这样的。