tl;博士:

$ export DATABASE_URL=postgres://user:pwd@localhost:5432/new_db
$ RAILS_ENV=test bundle exec rails c
[1] pry(main)> ActiveRecord::Base.connection.current_database
=> "test"
[2] pry(main)> ActiveRecord::Base.establish_connection;nil
=> nil
[3] pry(main)> ActiveRecord::Base.connection.current_database
=> "new_db"
[4] pry(main)> # WTF ?!?

背景:我们目前正在托管几个作业,以构建、测试和推动heroku我们的开发和QA环境。由于database.yml文件中有相同的测试配置,当两个env同时测试时,我们最终都失败了,因此我们决定使用两个数据库。
我们所做的:为了实现这一点(使用具有相同database.yml文件的多个数据库),我们决定将database_URL环境变量的值设置为“postgres://user:pwd@localhost:5432/new_db”。
问题是:只有在控制台中手动运行建立连接时,才会使用数据库URL的值。奇怪的是,运行rake会影响右边的db(new_db)。
Rails版本是3.2.19
是否有任何方法可以正确重写该环境变量?
多谢提前!

最佳答案

在config/initializers中有一个文件执行了以下操作:

Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
    config['pool']              = ENV['DB_POOL'] || 5
    ActiveRecord::Base.establish_connection(config)
  end
end

这个文件说:总是从database.yml加载配置,并添加两个参数reaing_frequencypool
将初始值设定项更改为此值可以解决问题:
Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    if !ENV['DATABASE_URL']
      config = Rails.application.config.database_configuration[Rails.env]
      config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
      config['pool'] = ENV['DB_POOL'] || 5
      ActiveRecord::Base.establish_connection(config)
    else
      ActiveRecord::Base.establish_connection
    end
  end
end

注意:默认的rails行为是先在ENV['DATABASE_URL']中搜索配置,然后在config/database.yml中搜索配置。因此,如果您只是删除初始化器,这也解决了问题。

10-05 20:31
查看更多