Ruby on rails 不同型号的数据库连接取决于环境

Ruby on rails 不同型号的数据库连接取决于环境,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个模型MessageImporter,它使用self.build\u connection连接到与其他模型不同的数据库。当我通过硬编码的连接信息时,一切正常。现在,我需要连接以依赖于当前环境。所以我把这些信息添加到我的应用程序中,这是一个简单漂亮的配置。我被困在如何将连接信息传递给self.building\u connection 以下是我当前的代码: class MessageImporter < ActiveRecord::Base self.establish_conne

我有一个模型MessageImporter,它使用self.build\u connection连接到与其他模型不同的数据库。当我通过硬编码的连接信息时,一切正常。现在,我需要连接以依赖于当前环境。所以我把这些信息添加到我的应用程序中,这是一个简单漂亮的配置。我被困在如何将连接信息传递给self.building\u connection

以下是我当前的代码:

class MessageImporter < ActiveRecord::Base
  self.establish_connection lambda {{
    :adapter => APP_CONFIG[:external_messages][:adapter],
    :host => APP_CONFIG[:external_messages][:host],
    :database => APP_CONFIG[:external_messages][:database],
    :username => APP_CONFIG[:external_messages][:username],
    :password => APP_CONFIG[:external_messages][:password]
  }}

# […]
或者是否有更好的/Rails-ish方法为各个型号设置不同的db连接?

根据,建立连接方法接受散列作为输入。你试过这个吗-

class MessageImporter < ActiveRecord::Base
  establish_connection {
    :adapter => APP_CONFIG[:external_messages][:adapter],
    :host => APP_CONFIG[:external_messages][:host],
    :database => APP_CONFIG[:external_messages][:database],
    :username => APP_CONFIG[:external_messages][:username],
    :password => APP_CONFIG[:external_messages][:password]
  }
根据,建立连接方法接受散列作为输入。你试过这个吗-

class MessageImporter < ActiveRecord::Base
  establish_connection {
    :adapter => APP_CONFIG[:external_messages][:adapter],
    :host => APP_CONFIG[:external_messages][:host],
    :database => APP_CONFIG[:external_messages][:database],
    :username => APP_CONFIG[:external_messages][:username],
    :password => APP_CONFIG[:external_messages][:password]
  }

方法稍有不同,但效果良好:

将连接信息添加到常规数据库。yml:

注意嵌套!消息\u导入嵌套在开发下面

在消息_importer.rb中:


仍然想知道为什么我的第一种方法不起作用,但这正如预期的那样。

方法有点不同,它起作用了:

将连接信息添加到常规数据库。yml:

注意嵌套!消息\u导入嵌套在开发下面

在消息_importer.rb中:


仍然想知道为什么我的第一种方法不起作用,但这正如预期的一样。

Jup,我试过了。但是使用这些代码,我甚至会遇到语法错误:如果用字符串替换散列中的符号,会发生什么情况,所以:adapter=>APP_CONFIG['external_messages']['adapter']等等?这给了我一个警告,当你没有预料到它时,你有一个nil对象-错误找到一个解决方案将在8年后发布。。。这确实是一个语法错误,因为解释器认为您正在启动一个块,而不是传递散列。如果要传递散列,请使用显式括号来建立连接{…}现在散列卷曲是可选的。但是使用这些代码,我甚至会遇到语法错误:如果用字符串替换散列中的符号,会发生什么情况,所以:adapter=>APP_CONFIG['external_messages']['adapter']等等?这给了我一个警告,当你没有预料到它时,你有一个nil对象-错误找到一个解决方案将在8年后发布。。。这确实是一个语法错误,因为解释器认为您正在启动一个块,而不是传递散列。如果要传递散列,请使用显式括号建立连接{…}。现在散列卷曲是可选的。
development:
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: […]
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

  message_import:
    adapter: mysql
    encoding: utf8
    username: […]
    password: […]
    database: […]
    host: […]
class MessageImporter < ActiveRecord::Base
  establish_connection configurations[RAILS_ENV]['message_import']