我试图从一个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
发生什么事了?!
答案 0 :(得分:5)
你可以这样写:
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
答案 1 :(得分:3)
反转它确实有效,因为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
和development
秒来解决了希望同时为test
和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
答案 2 :(得分:0)
在我使用Ruby 2和Rails 3.2.13的系统上,我可以运行rake db:drop
这会丢弃测试和开发数据库。现在比搞乱佣金任务要容易得多