使用rails在多个数据库中与同一个表进行交互

时间:2013-03-11 22:07:23

标签: ruby-on-rails ruby ruby-on-rails-3.2

我的要求就像是库存管理。我必须创建一个Web应用程序,它与我们所有开发环境中的同一个表交互(现在为5个)并进行更新,删除等。

我读到了使用以下方法连接多个数据库:

 class Qa1 < ActiveRecord::Base
    self.abstract_class = true
      establish_connection "qa1_#{Rails.env}"
    end

    class Qa2 < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "qa2_#{Rails.env}"
end

现在我有一张桌子

class Table1Qa1 < Qa1
end

class Table1Qa2 < Qa2
end

class Table1Qa3 < Qa3
end

这是有效的,但我认为有更好的方式来连接而不是创建  这么多模特对同一张桌子的对象?

我正在使用Rails 3.2和ruby 1.9.3

由于

3 个答案:

答案 0 :(得分:1)

你可以试试ar-octopus宝石 - https://github.com/tchandy/octopus

看起来你可以这样做,

Octopus.using(:db1) do
  User.create(:name => "Mike")
end

Octopus.using(:db2) do
  User.create(:name => "Mike")
end

@user_db1 = User.using(:db1).find_by_name("Sam")
@user_db2 = User.using(:db2).find_by_name("Sam")

答案 1 :(得分:1)

我想要弄清楚一件重要的事情是:你真的需要这样做吗?如果你需要的只是在不同数据库之间同步一个或多个表的内容,那么编写一个定期将主表中的记录复制到其他表中的cron作业就像这样简单:

connection_params.each do |params|
  ActiveRecord::Base.establish_connection(params)

  sql = "INSERT INTO #{params[:table_name]} (Foo, Bar, Fizz, Buzz)
        SELECT Foo, Bar, Fizz, Buzz
        FROM master_qa"
        #optionally WHERE ...

  ActiveRecord::Base.connection.execute(sql)
end

或者,如果您必须将不同的逻辑应用于不同的环境,那么为每个表实现一个ActiveRecord模型可能不是一个坏主意。毕竟,您可以将公共逻辑保留在Ruby模块中,并将模块混合在所有模型中。

module QA
  def self.order_by_foo
    order("foo DESC")
  end

  def self.included(model_class)
    # This hooks gets fired whenever the QA gets included by a class.
    # You can use it to call class methods on your models. Eg:
    model_class.validates :foo, :presence => true
  end
end

class Qa1 < ActiveRecord::Base
  include QA
  establish_connection(:qa1)
end

class Qa2 < ActiveRecord::Base
  include QA
  establish_connection(:qa2)
end

class Qa3 < ActiveRecord::Base
  include QA
  establish_connection(:qa3)
end

答案 2 :(得分:0)

使用以下方法是一般模型。

调用此方法时,请在db_conf的位置传递conf名称。

def self.get_data(id,db_conf,table_name)

    connection_hash = configurations[db_conf]

    establish_connection connection_hash

    con = connection()

          sql = "SELECT *
                 FROM " + table_name

     result = con.execute(sql)

     remove_connection

     establish_connection configurations["RAILS_ENV"]

     result

  end

<强>的database.yml

db_one_conf:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: one
  pool: 8
  username: root
  password: bomchickuwahwah
  socket: /var/run/mysqld/mysqld.sock

db_two_conf:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: two
  pool: 8
  username: root
  password: bomchickuwahwah
  socket: /var/run/mysqld/mysqld.sock

db_three_conf:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: three
  pool: 8
  username: root
  password: bomchickuwahwah
  socket: /var/run/mysqld/mysqld.sock

我建立与新数据库的连接并删除连接并连接回旧数据库。