2010-01-24 73 views
2

我在Rails中編寫了一個更簡單的phpMyAdmin版本;此Web應用程序將運行在Web服務器上(用戶將能夠指出在同一網絡上運行的數據庫服務器之一的數據庫名稱,主機名,用戶名,密碼和端口號)。然後用戶將連接到該機器,並將能夠使用UI來管理該數據庫(添加或刪除列,刪除表等)。Rails中的多個數據庫連接

我有兩個相關的問題(你的幫助將極大地幫助我瞭解如何最好地處理這個):

  1. 在傳統的Rails應用程序我將存儲在database.yml中的數據庫信息,但是在這裏我需要動態地做到這一點。是否有一種很好的方法可以將database.yml文件留空並告訴Rails在運行時使用用戶提供的連接數據呢?

  2. 不同的用戶可能連接到不同的數據庫(甚至主機)。我假設我需要跟蹤建立的數據庫連接和用戶會話之間的關聯。達到此目的的最佳方式是什麼?

在此先感謝您。

回答

2
  1. 爲了防止滑軌使用的database.yml ActiveRecord的初始化,您可以簡單地從config.frameworks中的config/environment.rb中刪除:active_record。然後,要手動建立連接,請使用ActiveRecord::Base.establish_connection。 (也許ActiveRecord::Base.configurations

    ActiveRecord存儲與類變量相關的所有連接。所以如果你想動態地創建多個連接,你還必須動態地將子類ActiveRecord :: Base和調用establish_connection。

    這將是您將用於實際管理表的任何子類的抽象基類。爲了讓ActiveRecord知道這一點,你應該在基類定義中做self.abstract_class = true

    然後,您要管理的每個表將依次動態地將這個新的抽象基類繼承下來。

  2. 這比較困難,因爲當然你不能真正堅持連接。我能想到的直接解決方案是在會話中存儲唯一的令牌,並在before_filter中使用該令牌返回動態ActiveRecord :: Base子類,您可能將其存儲在某個散列中。

    • 您必須保存所有的會話數據庫連接信息,以便其他工作人員可以使用它:

      一旦開始運行多個Rails工作進程這會更有意思。

    • 您可能希望跨工作人員使用一致的唯一標記,因此對數據庫連接參數的組合使用散列函數。
    • 由於工作人員可能會使用令牌調用它尚不知道的信息,因此您的子類化和establish_connection邏輯可能會在before_filter中發生。 (例如,而不是登錄時刻。)
    • 您將必須找出一些巧妙的垃圾收集連接和類的方法,用於用戶未正確註銷並且會話過期。 (對不起,我不知道這個。)