0

我有一批按顺序运行的 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返回一个空数组[]。但是,在所有 rake 任务完成Order.all立即有数据。

关于 rake db:seed 以及在下一个调用的任务中访问 ActiveRecord 数据,我缺少什么?

4

2 回答 2

1

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

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

于 2012-09-11T02:36:06.010 回答
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
于 2012-09-11T03:37:40.250 回答