繁体   English   中英

基于用户参数的rails中的不同数据库连接

[英]Different database connections in rails based on user params

我正在重构遗留php应用程序的一些功能,它使用具有相同结构的多个数据库,每种语言一个。 当用户登录选择他的语言,然后所有以下连接都是使用该应用程序的数据库进行的,其代码如下:

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

我想重构数据库,但目前它不是一个选项,因为其他软件应该在新应用程序开发的同时保留生产旧结构,并且在开发之后的一段时间内。

我看到了这个问题 ,但问题和建议的宝石都很老了,似乎他们没有使用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

使用我创建的MultiConfig gem来简化这一过程。

您可以在单独的文件中指定配置,如database_italian.yml等,然后调用:

ActiveRecord::Base.config_file = 'database_italian'

这样,维护和清洁看起来会更容易。 只需添加更多语言db配置文件即可

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM