如何在一个rake任务中删除测试和开发数据库?

时间:2012-04-18 01:52:17

标签: ruby-on-rails ruby-on-rails-3.1

我试图从一个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

发生什么事了?!

3 个答案:

答案 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:rebuilddevelopment秒来解决了希望同时为testdevelopment执行自定义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

Here is a gist of my full db.rake file with simultaneous multi-environment db:rebuild and db:truncate

答案 2 :(得分:0)

在我使用Ruby 2和Rails 3.2.13的系统上,我可以运行rake db:drop

这会丢弃测试和开发数据库。现在比搞乱佣金任务要容易得多