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.
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.
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.
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'
Ü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.
[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