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

我有多个数据库,里面有相同的表和列名称(但不同的唯一ID和行..)。 它不是拥有一个包含所有行的庞大数据库,而是分成不同的数据库。 这是我无法改变的(您可以将其视为从不同国家收集相同的数据,但每个国家/地区都有自己的数据库)。 这些数据库是“只读”的 – 这意味着,当我通过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,因此从不同的数据库获取数据并将它们连接在一起应该没有任何问题…

谢谢!

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

但是,您可以尝试在config/database.yml定义不同的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(...) 

我自己并没有详细尝试过这个,但它应该是这样的。