簡體   English   中英

如何使用 rails 遷移運行 rake 任務

[英]how to run rake task using rails migration

我想使用遷移運行 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

請指導執行此任務的遷移將是什么,這里的任何人都將拯救我的生命?

遷移實際上只是遵循約定的 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

參考:

如果您想在自動運行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塊內)

你可以去@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM