我想使用迁移来运行rake任务,因为我们希望当用户运行rails db:migrate
时,该任务将通过迁移来运行。
我的耙子任务是:
namespace :task_for_log do
desc "This task set by default as current date for those logs where log_date is nil"
task set_by_default_date_of_log: :environment do
Log.where("log_date IS NULL").each do |log|
log.update_attributes(log_date: log.created_at.to_date)
end
end
end
请指导执行此任务的迁移是什么,这里有谁能救我一命?
答案 0 :(得分:3)
迁移实际上只是遵循约定的Ruby文件,因此,如果要在其中运行rake任务,则可以使用标准的Ruby约定。
class ExampleMigration < ActiveRecord::Migration[5.0]
def change
Rake::Task['task_for_log'].invoke
end
end
但是,迁移文件应专门用于处理数据库架构。我会重新考虑您如何解决这个问题以寻求更好的解决方案。例如,您可以运行一条SQL语句来更新日志属性,而不用调用rake任务。
class ExampleMigration < ActiveRecord::Migration[5.0]
def change
execute <<-SQL
UPDATE logs SET log_date = created_at WHERE log_date IS NULL
SQL
end
end
参考文献:
答案 1 :(得分:2)
如果要在自动运行db:migrate
之后运行 任务,则可以使用enhance
。
Rake::Task['db:migrate'].enhance do
# This task runs after every time you run `db:migrate`
Rake::Task['task_for_log:set_by_default_date_of_log'].invoke
end
对于Rails应用程序,您可以将其放在lib/tasks
文件夹中的任何位置,也可以将任务内联(在.enhance do
块的内部)
答案 2 :(得分:1)
您可以通过@joseph提及更好的解决方案!或为其创建自定义任务。
rake cm:set_by_default_date_of_log
#lib/tasks/cm.rake
#custom_migration
namespace :cm do
desc "This task set by default as current date for those logs where log_date is nil"
task set_by_default_date_of_log: ['db:migrate'] do
Log.where("log_date IS NULL").each do |log|
log.update_attributes(log_date: log.created_at.to_date)
end
end
end