我有一批按顺序运行的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数据答案 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