2013-07-14 118 views
0

我正在構建一個rails應用程序來存儲許多不同的用戶提供的數據庫連接,並針對每個數據庫連接執行任意sql。我將每個數據庫連接字符串表示爲「連接」模型的實例,並且希望能夠編寫一個方法來查詢由每個連接表示的數據庫,理想情況下使用activerecord ORM。但是,當我使用下面的代碼中的establish_connection方法時,寫入的代碼將覆蓋整個連接表的數據庫連接。您如何建議我更改代碼以查詢任意數據庫,而不覆蓋整個Connections表的連接?使用activerecord嵌套數據庫

class Connection < ActiveRecord::Base 
    validates_presence_of :host, :port, :db_name, :db_user, :db_password, :db_type 

    def connect 
    self.connection = ActiveRecord::Base.establish_connection(
     adapter: self.db_type, 
     host: self.host, 
     database: self.db_name, 
     username: self.db_user, 
     password: self.db_password 
    ) 
    end 

end 

回答

1

一個好辦法做到這一點正在爲你需要的每個數據庫連接的模型,然後讓其他車型作爲他們的子類。因此,例如:

  1. 定義在database.yml中所有所需的連接(每個環境)
# DB 1 
    development: 
     adapter: mysql2 
     encoding: utf8 
     database: db_1 
     username: **** 
     password: **** 
     host: ******** 
     pool: 5 
     ... 

    # DB 2 
    db2_development: 
     adapter: mysql2 
     encoding: utf8 
     database: db_2 
     username: **** 
     password: **** 
     host: ******** 
     pool: 5 
     ... 

    # Same for production (and/or other environments) 
    production: 
     ... 
    db2_production: 
     ... 
  1. 定義每個數據庫中的 「主」 模型,該模型從ActiveRecord::Base繼承
# DB1 
    class DB1 < ActiveRecord::Base 
     self.abstract_class = true 
    end 

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

    ... 
  1. 現在定義的所有數據庫的特定型號如上定義模型的子類,這種方式:
# DB1 specific model 
    class DB1_model < DB1 
     # model logic here 
    end 

    # DB2 specific model 
    class DB2_model < DB2 
     # model logic here 
    end 

    ... 

,你是好去。

通過這種方式,您可以連接到在不同的環境N個數據庫(通常developmentstagingpreprodproduction,但他們可能是你的情況不同)。

另外,請記住,Rails將管理每個數據庫的SQL連接池。

在上面的例子,Rails會最多5連接對於每個數據庫中打開,所以總將(爲應用程序的單個實例)。 如果您使用Phusion Passenger或Unicorn,併產生8個應用程序實例,總SQL連接將是(最大值)10 * 8 = 80.

+0

感謝您的想法......我最終創建了一個實例方法連接模型,它使用Sequel gem返回一個連接。這樣數據庫就不需要在database.yml中預先定義。但我會接受你的答案! – user1609682

+0

@ user1609682謝謝,如果你接受(我希望它幫助你找到自己的解決方案)! – xmikex83