ruby-on-rails 如何在Rails中使用迁移运行Rake任务?

ufj5ltwl  于 2023-04-22  发布在  Ruby
关注(0)|答案(3)|浏览(124)

我想在Rails中使用迁移运行一个Rake任务。每次执行rails db:migrate命令 任务将通过迁移运行。
当前的Rake任务如下。

namespace :task_for_log do
    desc 'This task sets current date as a default for 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

如何使用迁移文件运行该任务?

1bqhqjot

1bqhqjot1#

迁移实际上只是遵循约定的Ruby文件,所以如果你想在其中运行一个rake任务,你可以调用Rake类。

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

参考文献:

bwitn5fc

bwitn5fc2#

如果你想在自动运行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块内)。

js81xvg6

js81xvg63#

你可以去@约瑟夫提到更好的解决方案!或创建自定义任务。

rake:

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

相关问题