2011-04-07 59 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'

这样它会更容易维护和清洁期待。只需添加更多语言数据库配置文件,如你所愿