动态第二个数据库Ruby

时间:2014-01-03 15:46:19

标签: mysql ruby-on-rails database

我想基于我正在开发的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。

1 个答案:

答案 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以获取更多示例。