2013-03-11 47 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 
相關問題