2013-03-11 62 views
0

我的需求就像库存管理一样。我要创建一个Web应用程序与同一个表中的所有我们的开发环境(5现在)的相互作用,并做更新,删除等使用rails在多个数据库中使用同一表进行交互

我读到关于使用多个DB连接:

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

感谢

+0

我们可以通过该数据库名作为参数,并连接 – beck03076 2013-03-11 22:10:25

+0

你将如何运行这段代码? Web应用程序或rake任务/ bash脚本? – 2013-03-11 22:17:31

+0

@和它的一个轨道应用程序 – harshit 2013-03-11 22:19:16

回答

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") 
+0

这看起来很好,更干净的方式来做到这一点。会试一试 – harshit 2013-03-12 01:58:07

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 

的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 

进出口建立一个新的数据库的连接和拆卸连接和连接回旧的数据库。

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 
相关问题