1

我的要求就像库存管理。我必须创建一个 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

谢谢

4

3 回答 3

2

我想要弄清楚的一件重要事情是:你真的需要这样做吗?如果您所需要的只是跨不同数据库同步一个或多个表的内容,那么编写一个定期将记录从主表复制到其他表的 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
于 2013-03-11T22:54:55.340 回答
1

你可以试试ar-octopusgem - 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")
于 2013-03-11T22:15:23.900 回答
0

使用下面的方法是一个通用模型。

调用此方法时,传递 conf 名称代替 db_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

数据库.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

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

于 2013-03-11T22:17:39.217 回答