2012-04-18 52 views
4

我試圖從一個rake任務跌落測試和開發的數據庫是這樣的:如何在一個rake任務中放置測試和開發數據庫?

task :regenerate do 
    Rails.env = "test" 
    Rake::Task["db:drop"].invoke 
    Rails.env = "development" 
    Rake::Task["db:drop"].invoke 
end 

測試數據庫已成功刪除。但開發數據庫沒有被丟棄。

關於如何使這項工作的任何想法?

注:這是on Rails的3.2.3

UPDATE:

很奇怪,但反向排序工作:

task :regenerate do 
    Rails.env = "development" 
    Rake::Task["db:drop"].invoke 
    Rails.env = "test" 
    Rake::Task["db:drop"].invoke 
end 

這是怎麼回事?

+1

看看:http://stackoverflow.com/questions/1090176/how-do-i-force-rails-env-in-a-rake-task – Vik 2012-04-18 05:12:37

回答

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 

它總是添加test如果ENV是development。我解決了想通過運行development第一個和test秒來同時執行developmenttest定製db:rebuild任務的情況。另外,在運行任務之前,我打電話給我的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

4

你可以寫這樣的:

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 
0

我與紅寶石2和Rails 3.2.13我可以運行耙分貝系統:滴

這既降低測試和開發數據庫。現在比耙子任務更容易

相關問題