Ruby on rails 如何使用rails迁移运行rake任务
我希望使用迁移来运行rake任务,因为我们希望当用户运行Ruby on rails 如何使用rails迁移运行rake任务,ruby-on-rails,ruby,ruby-on-rails-5,rails-migrations,Ruby On Rails,Ruby,Ruby On Rails 5,Rails Migrations,我希望使用迁移来运行rake任务,因为我们希望当用户运行railsdb: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_d
railsdb: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 ExampleMigration < ActiveRecord::Migration[5.0]
def change
Rake::Task['task_for_log'].invoke
end
end
class ExampleMigation
但是,迁移文件应专门用于处理数据库架构。我会重新考虑你是如何处理这个问题的,以便找到更好的解决办法。例如,您可以运行更新日志属性的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
class ExampleMigation 执行你可以像@joseph一样提到更好的解决方案!或者为其创建自定义任务
耙子:
任务:
如果要在自动运行db:migrate
后运行任务,可以使用enhanced
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
文件夹中的任何位置,或者将任务内联(放在.enhanced do
块中)如果您打算使用迁移,为什么要在此处使用rake任务?这些更新本身可以是迁移的一部分,因为这是我的客户的要求,因此我需要它。我正在使用PGSql,您可以根据此转换吗?当然,我更新了它。我不知道您的日志
表的名称,因此您可能需要相应地更改它。下面是我使用的参考:runjustremovetablefromsql命令。谢谢,它很好用。@JosephCho投了一张合适的票。:)但是我的客户机这种方法不好,因为我们必须通过手动命令运行此任务,因此我们必须在运行此任务的位置创建一个迁移文件
#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
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