[英]How to drop test and development database in one rake task?
我试图从一个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
到底是怎么回事?!
你可以像这样写:
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
反转它确实有效,因为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是development
它总是添加test
。 我解决了想要做一个自定义的情况下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
在我使用Ruby 2和Rails 3.2.13的系统上,我可以运行rake db:drop
这会丢弃测试和开发数据库。 现在比捣乱rake任务容易得多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.