2011-04-07 138 views
4

我重構它使用多個數據庫具有相同的結構,每一個語言的遺留PHP應用程序的某些功能。當用戶登錄選擇自己的語言,則以下所有的連接與DB取得該應用與一些像這樣的代碼:不同的數據庫連接PARAMS

$db_name = 'db_appname_' . $_SESSION['language']; 
mysql_connect(...); 
mysql_select_db($db_name); 

我想也重構了數據庫,但目前它不是一個選項因爲在開發新應用程序的同時,其他軟件應保留在舊結構的生產中,並且在開發新應用程序一段時間之後。

我看到this question,但兩者的問題和建議的寶石是很老的,似乎他們沒有使用Rails工作3

這是實現這一行爲在我的新的Rails 3應用程序的最佳方法?有沒有其他選擇可以避免我改變數據庫結構並滿足我的需求?

一個細節:在PHP應用程序甚至登錄信息被保存在單獨的表,即每塊都有自己的用戶表,當它在用戶登錄也通過在登錄表單的語言PARAM。我想用設計爲在新的應用程序,它可能不會使用這種方法工作的權威性,所以我想複製(我知道,這是不是DRY)登錄在一個單獨的用戶模型信息與語言屬性並在語言之間共享一個單獨的數據庫,以使用設計功能與我的應用程序。這會造成任何問題嗎?

編輯:

爲了完整起見,我用這個陽明配置文件

production: &production 
    adapter: mysql 
    host: localhost 
    username: user 
    password: secret 
    timeout: 5000 

production_italian: 
    <<: *production 
    database: db_app_ita 

production_english: 
    <<: *production 
    database: db_app_eng 

以及與此配置中的基礎模型結束(其實不完全是這樣,但是這是用來堆放雜物全部清除)

MyModel < AR::Base 
    establish_connection "production_#{session[:language]}" 
    ... 
end 

回答

4

在您的模特中使用establish_connection

MyModel < AR::Base 
    establish_connection "db_appname_#{session[:language]}" 
    ... 
end 
+0

我見[這裏](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-establish_connection),這種方法需要一個散列作爲數據庫=>「db_appname _#{會議[:語言]}」的說法,所以我應該在database.yml中或給一個連接的名稱?感謝提示,我會試驗它。 – Fabio 2011-04-07 18:02:11

+0

是的,你是對的。您應該將所有連接存儲在'database.yml'文件中。這就是Rails的做法 – fl00r 2011-04-07 18:04:40

+0

感謝您的答案,它的工作原理... – Fabio 2011-04-07 22:49:21

0

使用MultiConfig寶石我創造,使這個容易。

您可以指定在像database_italian.yml等單獨的文件中CONFIGS然後調用:

ActiveRecord::Base.config_file = 'database_italian'

這樣它會更容易維護和清潔期待。只需添加更多語言數據庫配置文件,如你所願