4

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

到底是怎么回事?!

4

3 回答 3

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
于 2012-04-18T05:07:12.300 回答
4

反转它确实有效,因为有一些奇怪的代码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

test如果 env 是,它总是添加development。我解决了想要同时执行自定义db:rebuild任务developmenttest通过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

这是我的完整db.rake文件的要点,其中包含同时多环境db:rebuilddb:truncate

于 2013-11-19T17:46:22.940 回答
0

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

这会同时删除测试和开发数据库。现在比搞乱 rake 任务容易得多

于 2014-06-17T02:44:15.067 回答