我想基于我正在开发的SQLite文件之外的变量向我的应用程序添加第二个只读数据库。
所以,应该有三个数据库
1.本地SQLite文件
2.生产只读MySQL数据库
3.测试只读MySQL数据库
此测试数据库已添加新列,并将很快作为生产数据库推送。
从this SO-Q,我不明白解决方案是什么。
我已经使用establish_connection
了。
establish_connection(
:adapter => 'mysql2',
:database => "db1",
:username => "username",
:password => "p*ssw*rd",
:host => "ho.st.com"
)
此db1
是生产数据库,不含额外的表格列
db2
是测试数据库,额外的表列。
establish_connection(
:adapter => 'mysql2',
:database => "db2",
:username => "username",
:password => "p*ssw*rd",
:host => "ho.st.com"
)
我认为这可能是一个解决方案:
在MySQL数据库的表模型中:
config = 'test'
case config
when 'test'
establish_connection(
:adapter => 'mysql2',
:database => "db1",
:username => "username",
:password => "p*ssw*rd",
:host => "ho.st.com"
)
else
establish_connection(
:adapter => 'mysql2',
:database => "db2",
:username => "username",
:password => "p*ssw*rd",
:host => "ho.st.com"
)
end
但是现在我必须在更改状态时编辑所有“受影响”的模型。有没有办法变异(即使是一个单词?)这样我只需要编辑一次这个配置吗?
我已经通过Application_controller.rb尝试过,但这不起作用。
# Application_controller.rb
def get_config_status
return 'test'
end
# model.rb
config = get_config_status() #=> undefined method `get_config_status' for Regio(Table doesn't exist):Class
# or
config = Application.get_config_status #=> uninitialized constant Regio::Application
或者我应该完全考虑别的什么? 说实话,我不喜欢在模型中添加用户名和密码。这是黑客的可能线索吗?
我想要完成的是: 设置一个变量,以便我的应用程序使用db2而不是db1。
答案 0 :(得分:0)
章鱼宝石可能会有所帮助。
https://github.com/tchandy/octopus
您可以在查询级别选择数据库,
User.where(name: 'Sam').using(:db2)
或者您可以按控制器操作选择数据库,
class ApplicationController < ActionController::Base
around_filter :select_shard
def select_shard(&block)
Octopus.using(:db1, &block)
end
end
查看Github上的readme以获取更多示例。