我正在重构一个遗留 php 应用程序的一些功能,该应用程序使用具有相同结构的多个数据库,每种语言一个。当用户登录时选择他的语言,然后使用如下代码与该应用程序的数据库建立以下所有连接:
$db_name = 'db_appname_' . $_SESSION['language'];
mysql_connect(...);
mysql_select_db($db_name);
我也想重构数据库,但目前这不是一个选项,因为在开发新应用程序时以及在开发新应用程序后的一段时间内,其他软件应该使用旧结构保留在生产环境中。
我看到了this question ,但是问题和建议的 gem 都很旧,而且它们似乎不适用于 Rails 3。
在我的新 Rails 3 应用程序中实现此行为的最佳方法是什么?还有其他选择可以避免我更改数据库结构并满足我的需要吗?
最后一个细节:在 php 应用程序中,甚至登录信息都保存在单独的表中,即每个数据库都有自己的用户表,当用户登录时,它还会在登录表单中传递一个语言参数。我想在新应用程序中使用 devise for auth,这可能不适用于这种方法,所以我想在一个单独的用户模型中复制(我知道,这不是 DRY)登录信息具有语言属性和一个在语言之间共享的单独的数据库,以便在我的应用程序中使用设计功能。这会导致任何问题吗?
编辑:
为了完整性,我以这个 yml 配置文件结尾
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
最佳答案
在您的模型中使用establish_connection
:
MyModel < AR::Base
establish_connection "db_appname_#{session[:language]}"
...
end
关于ruby-on-rails - 基于用户参数的 Rails 中的不同数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580121/