[RUBY] [Rails] Statusaktualisierung mithilfe der Rake-Task

In diesem Artikel fügen wir einer Blog-App mit zwei Arten von Artikelstatus, "Öffentlich" und "Entwurf", zunächst den neuen Status "Warten auf Veröffentlichung" hinzu. Wenn dann das geplante Veröffentlichungsdatum und die geplante Veröffentlichungszeit des Artikels, der im Status "Warten auf Veröffentlichung" gespeichert ist, vor dem aktuellen Datum und der aktuellen Uhrzeit liegen, wird der Stapel automatisch gedreht und auf den Status "Veröffentlichung" aktualisiert.

Ich werde darüber schreiben, wie eine Rake-Aufgabe erstellt wird, die das obige Update ermöglicht, und diesen Prozess auch mit wann immer ausführen.

Was ist überhaupt eine Rechenaufgabe?

Rake ist ein einfaches Build-Tool, mit dem Sie den Verarbeitungsinhalt in Ruby beschreiben können. Dieser in Ruby geschriebene Verarbeitungsinhalt wird als Rake-Task bezeichnet und kann durch Definieren in einer Rake-Datei ausgeführt werden.

Erstellen und Implementieren von Rake-Aufgaben

Eine Datei wird in lib / Task erstellt, indem Sie "$ Rails generieren Task Task Name" eingeben.

$ rails generate task status_task

Geben Sie den Artikel, den Sie ausführen möchten, in article.rb und die erstellte Datei ein.

article.rb


enum state: { draft: 0, published: 1, publish_wait: 2 }

scope :past_published, -> { where('published_at <= ?', Time.current) }

In article.rb wurden ursprünglich nur zwei Arten von Aufzählungen definiert: "Entwurf" und "Veröffentlichen". Fügen Sie also "Publish_wait" von "Warten auf Veröffentlichung" hinzu. Definieren Sie den Bereich von past_published im Bereich als Datum und Uhrzeit der Veröffentlichung vor der aktuellen Uhrzeit.

status_task.rake



namespace :status_task do
  desc 'Wenn es eine Warteliste gibt, deren Veröffentlichungsdatum und -zeit in der Vergangenheit liegen, wird der Status in "öffentlich" geändert.'
  task update_status_task: :environment do
    Article.publish_wait.past_published.find_each(&:published!)
  end
end

Holen Sie sich den Artikel "Warten auf Veröffentlichung" mit Article.publish_wait und aktualisieren Sie den Status von past_published auf "veröffentlicht" mit "Veröffentlicht"! In find_each werden standardmäßig 1000 Datensätze erfasst und die erfassten Daten werden einzeln verarbeitet, sodass sich die Ausführungsgeschwindigkeit der Verarbeitung weniger verlangsamt als bei find, die nach dem Erfassen aller Daten verarbeitet werden.

Vorstellen, wann immer

Als Nächstes stellen wir stündlich vor, wann die bisher erstellte Rake-Aufgabe ausgeführt werden soll. Wann immer eine Bibliothek in Schienen vorbereitet wird, um die Verarbeitungszeit von periodischen Stapeln zu verwalten, und ursprünglich ist es notwendig, einen Prozess namens cron vorzubereiten, der "XX zur XX-Zeit ausführt". Wenn Sie verwenden, können Sie den in crontab beschriebenen Inhalt, der Anweisungen für cron enthält, jederzeit in Ruby-Sprache schreiben.

Auf diese Weise können Sie festlegen, dass die Rechenaufgabe stündlich ausgeführt wird.

Zunächst werde ich von der Einführungsmethode aus schreiben.

gem 'whenever'

Wenn Sie Folgendes bündeln, installieren und ausführen, wird eine Datei mit dem Namen cofig / sched.rb erstellt.

$bundle exec wheneverize .

Schreiben Sie den Prozess zum stündlichen Ausführen der Rake-Aufgabe in diesen Zeitplan.

config/schedule.rb



# Rails.Erforderlich, um root zu verwenden
require File.expand_path(File.dirname(__FILE__) + "/environment")
#Umgebungsvariablen zum Ausführen von cron
rails_env = ENV['RAILS_ENV'] || :development
#Legen Sie Umgebungsvariablen fest, um cron auszuführen
set :environment, rails_env
#Cron Log Spucke Position
set :output, "#{Rails.root}/log/cron.log"
#Führen Sie jede Stunde eine Rechenaufgabe aus
every :hour do
  rake 'article_state:update_article_state'
end

Stellen Sie das Veröffentlichungsdatum und die Veröffentlichungszeit nur stündlich ein.

app/assets/javascripts/admin.js



format: 'YYYY-MM-DD HH:00'

Cron-Update

Überprüfen Sie zunächst den aktualisierten Inhalt, ohne cron neu zu schreiben, bevor Sie die in sched.rb geschriebenen Einstellungen wiedergeben.

$ bundle exec whenever

Wenn es kein Problem mit den Einstellungen gibt, aktualisieren Sie crontab unten.

$ bundle exec whenever --update-crontab 

Überprüfen Sie mit dem folgenden Befehl, ob die Rake-Task problemlos ausgeführt werden kann.

$ rake status_task:update_status_task

Das ist es.

Liste der Seiten, auf die verwiesen wird

[Ruby 2.7.0 Referenzhandbuch / Bibliotheksliste / Rake-Bibliothek] https://docs.ruby-lang.org/ja/latest/library/rake.html

[Rails-Dokument find_each] https://railsdoc.com/page/find_each

[Wenn Sie eine große Datenmenge in einem Stapel mit Rails aktualisieren möchten, verwenden Sie find_each.] http://blog.livedoor.jp/sasata299/archives/51882704.html

[Schienen wann immer angegeben Methode] https://taker.hatenablog.com/entry/2019/12/02/195950

Recommended Posts

[Rails] Statusaktualisierung mithilfe der Rake-Task
[Schienen] Implementieren Sie die Rechenaufgabe
Schienen: Wie man eine Rechenaufgabe schön schreibt
Verhindern Sie Vorgänge! Sichere manuelle Datenaktualisierungsmethode für Rails mithilfe von Transaktionen
Über die regelmäßige Ausführung der Rechenaufgabe der Schienenanwendung in Heroku
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Suchfunktion mit [Rails] Ransack
[Schienen] Speichern Sie Bilder mit Carrierwave
Japanisieren Sie mit i18n mit Rails
[Rails] Japanische Lokalisierung mit Rails-i18n
Definieren wir eine Rake-Aufgabe.
[Rails] Testcode mit Rspec
Fehler bei der Verwendung von Schienen Capybara
[Rails] Versuchen Sie, Faradays Middleware zu verwenden
Detaillierte Tipps zur Verwendung von Rails
[Rails 6] Sternförmige Überprüfung mit Raty.js