[RUBY] Schienen: Wie man eine Rechenaufgabe schön schreibt

Gutes Gefühl = die folgenden zwei Punkte

  1. Einfach zu testen
  1. (Bis zu einem gewissen Grad) Der Schreibstil kann unter den Ingenieuren vereinheitlicht werden

etc

Code

lib/tasks/issue_6885.rake


require_relative 'helpers/all_user_name_update_helper.rb'

namespace :issue_6885 do

  desc 'Dies ist ein Beispiel'
  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("Anzahl der Zielbenutzer: #{all_users.size}")

      if all_users.blank?
        logger.info('Der Prozess wird beendet, da die Anzahl der Zielbenutzer 0 war.')
        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
  #Führen Sie auch die Standardausgabe durch
  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

  #Machen Sie den Namen der Protokolldatei mit dem Namen der Aufgabe identisch (ersetzen Sie ihn, da es besser ist, keinen Doppelpunkt zu verwenden).
  #Fälle, die nicht von der Ausführung der Rechenaufgabe stammen (z:spec) sollte berücksichtigt werden
  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

    #Stellen Sie sicher, dass Sie trocken laufen, es sei denn, Sie übergeben die Zeichenfolge explizit 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

Ausführungsbeispiel

Bei einem Trockenlauf


$ 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 -- :Anzahl der Zielbenutzer: 1
I, [2020-09-27T13:33:27.755933 #13040]  INFO -- : Finish. log_file_path: /app/log/issue_6885_all_user_name_update.log 

Punkt

  1. Die .rake-Datei ruft nur die Hilfsklasse auf, Rakes DSL? Ich habe versucht, die Methode der Klasse zu testen, an die ich gewöhnt bin, ohne mir Gedanken über die Art und Weise zu machen, wie ich Dinge mache
  1. Verwenden Sie Yield, um "Dryrun" und "Logger" (Teil von) zu standardisieren, damit Sie sie nicht jedes Mal definieren müssen, wenn Sie eine Rechenaufgabe erstellen.

Sobald Sie eine Vorlage haben, können Sie sich auf das konzentrieren, was Sie tun möchten, z. B. all_user_name_update_helper.rb! (^ ○ ^)

Impressionen

Recommended Posts

Schienen: Wie man eine Rechenaufgabe schön schreibt
Wie schreibe ich Rails
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
Wie schreibe ich Rails Seed
Wie schreibe ich Rails Routing
So schreiben Sie eine Datumsvergleichssuche in Rails
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
So schreiben Sie eine Migration vom Rails-Datums- / Uhrzeittyp zum Datumstyp
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie ein Video in Rails ein
[Einführung in Java] So schreiben Sie ein Java-Programm
[Rails] So erstellen Sie eine Teilvorlage
[SpringBoot] So schreiben Sie einen Controller-Test
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So führen Sie eine djUnit-Aufgabe in Ant aus
So deinstallieren Sie Rails
Wie schreibe ich Docker-Compose
Wie schreibe ich Mockito
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
[Rails] So erstellen Sie eine Twitter-Freigabeschaltfläche
So schreiben Sie eine Migrationsdatei
[Schienen] Implementieren Sie die Rechenaufgabe
So implementieren Sie eine nette Funktion in Ajax mit Rails
[Ruby on Rails] Wie schreibe ich eine Enumeration auf Japanisch?
So schreiben Sie einen Komponententest für Spring Boot 2
So löschen Sie ein mit Rails erstelltes new_record-Objekt
java: Wie schreibe ich eine generische Typliste? [Hinweis]
So generieren Sie manuell ein JWT mit Knock in Rails
[So fügen Sie ein Video mit Rails in haml ein]
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
[Schienen] Wie poste ich Bilder?
Wie man guten Code schreibt
[Rails] Verwendung von Enum
[Rails] Verwendung von Enum
Wie schreibe ich einen Java-Kommentar
Wie hinterlasse ich einen Kommentar?
Wie man Schienenrouten liest
Definieren wir eine Rake-Aufgabe.
[Refactoring] So schreiben Sie Routing
Verwendung von Rails Join
Wie schreibe ich Junit 5 organisiert
So beenden Sie den Rails-Server
[Rails] Verwendung der Validierung
So schreiben Sie ein benutzerorientiertes Programm (1)