2012-09-11 101 views
0

我有一個批次的運行順序rake任務:自定義rake任務無法在rake數據庫任務後立即訪問ActiveRecord數據?

task :batch_tasks => :environment do 
    Rake::Task["db:drop"].execute 
    Rake::Task["db:create"].execute 
    Rake::Task["db:migrate"].execute 
    Rake::Task["db:seed"].execute 
    Rake::Task["db:test:prepare"].execute 
    Rake::Task["custom_task_1"].execute 
end 

這裏是什麼在custom_task_1:

task :custom_task_1 => :environment do 
    puts "begin custom task" 
    orders = Order.all #three records 
    orders.each do |order| 
    puts "Do something to Order\n" 
    end 
    puts "end custom task" 
end 

當我運行上面的批處理過程,這裏是發生了什麼:

rake batch_tasks 
begin custom task 
end custom task 

但是,如果我在批處理後運行自定義任務,則會發生以下情況:

rake custom_task_1 
begin custom task 
Do something to Order 
Do something to Order 
Do something to Order 
end custom task 

有一點要注意,當我在rake batch_tasksrake db:seed後斷點運行調試器,上eval Order.all檢查返回一個空數組[]。但Order.all在之後確實有數據所有的rake任務都完成了。

我錯過了關於rake db:種子並有權訪問下一個任務中的ActiveRecord數據的情況?

回答

0

因此,快速解決方案是將db:test:prepare行移動到批處理結束。

我相信問題源於環境從development切換到test,然後自定義任務運行在最後一個環境,然後有一個空的測試數據庫。

db:seed命令可能會將環境切換回dev,並且自定義任務針對正確的數據庫運行。

task :batch_tasks => :environment do 
    Rake::Task["db:drop"].execute 
    Rake::Task["db:create"].execute 
    Rake::Task["db:migrate"].execute 
    Rake::Task["db:seed"].execute 
    Rake::Task["custom_task_1"].execute 
    Rake::Task["db:test:prepare"].execute # <-- Moved after all other tasks 
end 
1

由於建議mu太短,這與在遷移中使用它們之前需要重新加載模型有關。原因是你所有的rake任務都運行在一個通用的環境中,即它只加載一次rails。如此,表格定義可能已經建立。您可能不得不使用reset_column_information加載新值。

或者,您正在執行的任務順序看起來應該是獨立運行,這對capistrano或thor來說可能是一個很好的用例。

+0

在這種情況下,rake db:seed會不會失敗?它成功了,隨後的rake任務由於某種原因而無法訪問數據。 – wrburgess

+0

發現問題...您的答案不是解決方案,但它確實導致我以不同的方式篡改代碼。 – wrburgess