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_frequency
和pool
。将初始值设定项更改为此值可以解决问题:
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
中搜索配置。因此,如果您只是删除初始化器,这也解决了问题。