rake db任务后,自定义rake任务无法立即访问ActiveRecord数据?

时间:2012-09-11 00:19:34

标签: ruby-on-rails ruby ruby-on-rails-3 rake rake-task

我有一批按顺序运行的rake任务:

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_tasks之后使用断点在rake db:seed上运行调试器时,eval Order.all上的检查会返回一个空数组[]。但是,在{/ em>所有rake任务完成后,Order.all确实会立即获得数据

我对rake db:seed缺少什么,并且在下一个名为?

的任务中有权访问ActiveRecord数据

2 个答案:

答案 0 :(得分:1)

由于建议mu太短,这与在迁移中使用模型之前重新加载模型的需要有关。这样做的原因是所有rake任务都在一个公共环境中运行,即它只加载一次rails。因此,可能已经建立了表定义。您可能必须使用reset_column_information来加载新值。

或者,您正在执行的任务序列看起来应该是独立运行的,这可能是capistrano或thor的一个很好的用例。

答案 1 :(得分: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