dryrun est différente selon l'écrivain, un accident peut survenir lors de l'exécution d'une tâche à usage commercial, il est donc préférable qu'elle puisse être unifiée.etc
lib/tasks/issue_6885.rake
require_relative 'helpers/all_user_name_update_helper.rb'
namespace :issue_6885 do
  desc 'Ceci est un échantillon'
  task all_user_name_update: :environment do
    helper = AllUserNameUpdateHelper.new
    helper.main
  end
end
lib/tasks/helpers/all_user_name_update_helper.rb
require_relative 'rake_helper_template'
class AllUserNameUpdateHelper < RakeHelperTemplate
  NEW_NAME = 'bar'
  def main
    template do |logger|
      all_users = get_all_user
      logger.info("Nombre d'utilisateurs cibles: #{all_users.size}")
      if all_users.blank?
        logger.info('Le processus se termine car le nombre d'utilisateurs cibles était de 0.')
        return
      end
      all_users.each { |user| update_name(user, NEW_NAME) }
    end
  end
  private
  def get_all_user
    User.all
  end
  def update_name(user, new_name)
    user.update!(name: new_name)
    user
  end
end
lib/tasks/helpers/rake_helper_template.rb
class RakeHelperTemplate
  #Effectuer également une sortie standard
  def make_logger(log_file_path)
    logger = ActiveSupport::Logger.new(log_file_path)
    stdout_logger = ActiveSupport::Logger.new(STDOUT)
    broadcast_logger = ActiveSupport::Logger.broadcast(stdout_logger)
    logger.extend(broadcast_logger)
    logger.formatter = Logger::Formatter.new
    logger
  end
  #Rendez le nom du fichier journal identique au nom de la tâche (remplacez-le car il vaut mieux ne pas utiliser de deux-points)
  #Les cas appelés depuis l'exécution de la tâche rake:spec) doit être pris en considération
  def make_log_file_path
    task_name = Rake.try(:application)&.top_level_tasks&.[](0)&.gsub(':','_') || Rails.env
    log_file_name = "#{task_name}.log"
    Rails.root.join('log', log_file_name)
  end
  def template
    log_file_path = make_log_file_path
    #Assurez-vous de dryrun sauf si vous passez explicitement la chaîne false
    is_dryrun = ENV['is_dryrun'] != 'false'
    logger = make_logger(log_file_path)
    logger.info("Start. is_dryrun: #{is_dryrun}")
    ActiveRecord::Base.transaction do
      yield(logger)
      raise ActiveRecord::Rollback if is_dryrun
    end
    logger.info("Finish. log_file_path: #{log_file_path}")
  end
end
Lors d'un essai à sec
$ is_dryrun=false bundle exec rake issue_6885:all_user_name_update
I, [2020-09-27T13:33:27.229764 #13040]  INFO -- : Start. is_dryrun: true
I, [2020-09-27T13:33:27.556890 #13040]  INFO -- :Nombre d'utilisateurs cibles: 1
I, [2020-09-27T13:33:27.755933 #13040]  INFO -- : Finish. log_file_path: /app/log/issue_6885_all_user_name_update.log 
dryrun et logger (une partie de) afin que vous n'ayez pas à les définir à chaque fois que vous créez une tâche de râteau.Une fois que vous avez un modèle, vous pouvez vous concentrer sur ce que vous voulez faire comme all_user_name_update_helper.rb! (^ ○ ^)
Recommended Posts