【发布时间】:2011-11-28 09:41:27
【问题描述】:
我正在开发带有 MySQL 数据库和 mysql2 gem 的 Rails v2.3 应用程序。我遇到了一个奇怪的情况,即在 rake 任务中改变环境。
(我对环境和数据库的所有设置和配置都是正确的,没问题。)
这是我的简单故事:
我有一个像下面这样的 rake 任务:
namespace :db do
task :do_something => :environment do
#1. run under 'development' environment
my_helper.run_under_development_env
#2. change to 'custom' environment
RAILS_ENV='custom'
Rake::Task['db:create']
Rake::Task['db:migrate']
#3. change back to 'development' environment
RAILS_ENV='development'
#4. But it still run in 'customer' environment, why?
my_helper.run_under_development_env
end
end
rake 任务非常简单,它的作用是:
1.首先,在“development”环境下从my_helper运行一个方法
2.然后,切换到“custom”环境并运行db:create和db:migrate
到现在为止,一切都很好,环境确实变成了“custom”
3.然后,再次将其改回“开发”环境
4.在“development”环境下再次运行辅助方法
但是,虽然我在步骤 3 中将环境改回了“development”,但最后一个方法仍然在“custom”环境中运行,为什么?以及如何摆脱它?
--- ---
我还查看了related with environment change here 的帖子,并尝试使用那里的解决方案(在第 2 步中):
#2. change to 'custom' database
ActiveRecord::Base.establish_connection('custom')
Rake::Task['db:create']
Rake::Task['db:migrate']
要更改数据库连接而不是更改环境,但是db:create 和db:migrate 仍将在“development”数据库下运行,尽管链接的帖子说它应该运行在“自定义”数据库......奇怪
---------------重要更新---------
我才意识到步骤 2 中的代码:
#2. change to 'custom' environment
RAILS_ENV='custom'
Rake::Task['db:create']
Rake::Task['db:migrate']
它将环境更改为“custom”仅当Rake::Task['db:create'] 被调用,如果我注释掉Rake::Task['db:create'] 行,代码仍将在' 下运行>发展':
#2. change to 'custom' environment
RAILS_ENV='custom'
#Rake::Task['db:create']
#CODE WILL RUN STILL UNDER 'development' environment.
为什么Rake::Task['db:create'] 在我的情况下会影响环境变化...?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1