我试图从一个rake任务中删除测试和开发数据库,如下所示:
task :regenerate do
Rails.env = "test"
Rake::Task["db:drop"].invoke
Rails.env = "development"
Rake::Task["db:drop"].invoke
end成功地删除了测试数据库。但是开发数据库并没有被删除。
对如何使这件事奏效有什么想法吗?
注意:这是Rails 3.2.3
更新:
很奇怪,但倒序是有效的:
task :regenerate do
Rails.env = "development"
Rake::Task["db:drop"].invoke
Rails.env = "test"
Rake::Task["db:drop"].invoke
end怎么一回事?!
发布于 2013-11-19 17:46:22
逆转它确实有效,因为在database_tasks.rb中有一些奇怪的代码。
def each_current_configuration(environment)
environments = [environment]
environments << 'test' if environment == 'development'
configurations = ActiveRecord::Base.configurations.values_at(*environments)
configurations.compact.each do |configuration|
yield configuration unless configuration['database'].blank?
end
end如果env是test,它总是添加development。我解决了想要为同时运行的db:rebuild和test执行自定义development任务的问题,方法是先运行development,然后运行test。此外,在运行任务之前,我将调用我的set_env方法,该方法确保设置ActiveRecord::Tasks::DatabaseTasks.env,如果没有该方法,数据库连接似乎不会像预期的那样对环境进行谨慎处理。我尝试了所有其他类型的断开等等,但没有进一步的代码,这是有效的。
def set_env(env)
Rails.env = env.to_s
ENV['RAILS_ENV'] = env.to_s
ActiveRecord::Tasks::DatabaseTasks.env = env.to_s
end发布于 2012-04-18 05:07:12
你可以这样写:
namespace :db do
desc "Database custom drop"
task :mydrop do
system("rake db:drop RAILS_ENV=test")
system("rake db:drop RAILS_ENV=development")
end
end发布于 2014-06-17 02:44:15
在我使用Ruby 2和Rails 3.2.13的系统上,我可以运行rake :drop
这就降低了测试和开发数据库。现在比处理rake任务要容易得多
https://stackoverflow.com/questions/10201729
复制相似问题