【问题标题】:How can I dynamically change the Active Record database for all models in Ruby on Rails?如何动态更改 Ruby on Rails 中所有模型的 Active Record 数据库?
【发布时间】:2008-10-07 20:49:14
【问题描述】:

在我们的程序中,每个客户都有自己的数据库。我们通过电子邮件向他们发送一个链接,将他们连接到他们的数据库。该链接包含一个 GUID,让程序知道要连接到哪个数据库。

如何以编程方式将 ActiveRecord 动态连接到正确的数据库?

【问题讨论】:

    标签: ruby-on-rails database activerecord


    【解决方案1】:

    您也可以轻松完成此操作,无需硬编码任何内容并自动运行迁移:

    customer = CustomerModel.find(id)
    spec = CustomerModel.configurations[RAILS_ENV]
    new_spec = spec.clone
    new_spec["database"] = customer.database_name
    ActiveRecord::Base.establish_connection(new_spec)
    ActiveRecord::Migrator.migrate("db/migrate_data/", nil)
    

    我发现之后在特定型号上重新建立旧连接很有用:

    CustomerModel.establish_connection(spec)
    

    【讨论】:

      【解决方案2】:

      您可以随时通过调用 ActiveRecord::Base.establish_connection(...) 更改与 ActiveRecord 的连接

      IE:

       ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
          :username => "root", :password => "password" })
      

      【讨论】:

      • 请注意,这将清除您的缓存 - 因此它会为每个表执行“显示类似 %eachtable% 的表并显示创建表”。仅当您在每个请求上都建立新连接时才会出现问题...
      【解决方案3】:

      这个问题已经有一段时间了,但我不得不说还有另一种方法:

      conn_config = ActiveRecord::Base.connection_config
      conn_config[:database] = new_database
      ActiveRecord::Base.establish_connection conn_config
      

      【讨论】:

      • 这救了我的命!非常简单的答案!
      • 如何在不影响另一个池的情况下更改 connstring?
      • 我可能错了,但我几乎可以肯定ActiveRecord::Base.establish_connection 创建了一个新池。如果您有特定问题,打开一个新问题会更有好处。
      【解决方案4】:
      class Database
        def self.development!
          ActiveRecord::Base.establish_connection(:development)
        end
      
        def self.production!
          ActiveRecord::Base.establish_connection(ENV['PRODUCTION_DATABASE'])
        end
      
        def self.staging!
          ActiveRecord::Base.establish_connection(ENV['STAGING_DATABASE'])
        end
      end
      

      .env 中(例如dotenv-rails gem):

      PRODUCTION_DATABASE=postgres://...
      STAGING_DATABASE=postgres://...
      

      现在你可以:

      Database.development!
      User.count
      Database.production!
      User.count
      Database.staging!
      User.count
      # etc.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-06
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多