如何使用 rails 迁移 运行 rake 任务
how to run rake task using rails migration
我想 运行 使用迁移来抽取任务,因为我们希望当用户 运行 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
请指导 运行 这个任务将要迁移什么,这里有谁会救我的命吗??
迁移实际上只是 Ruby 遵循约定的文件,因此如果您想 运行 在其中执行一个 rake 任务,您只需调用 Rake class.
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
参考文献:
- Rails how to run rake task
- https://edgeguides.rubyonrails.org/active_record_migrations.html
你可以按照@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
如果您想 运行 您的任务 在 您 运行 db:migrate
之后自动执行,您可以使用 enhance
。 =15=]
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
块内)
我想 运行 使用迁移来抽取任务,因为我们希望当用户 运行 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
请指导 运行 这个任务将要迁移什么,这里有谁会救我的命吗??
迁移实际上只是 Ruby 遵循约定的文件,因此如果您想 运行 在其中执行一个 rake 任务,您只需调用 Rake class.
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
参考文献:
- Rails how to run rake task
- https://edgeguides.rubyonrails.org/active_record_migrations.html
你可以按照@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
如果您想 运行 您的任务 在 您 运行 db:migrate
之后自动执行,您可以使用 enhance
。 =15=]
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
块内)