[RUBY] [Rails] Mise à jour de l'état à l'aide de la tâche Rake

Dans cet article, nous allons d'abord ajouter un nouveau statut "En attente de publication" à une application de blog qui a deux types de statut d'article, "Public" et "Brouillon". Ensuite, lorsque la date et l'heure de publication programmée de l'article sauvegardé dans l'état "en attente de publication" sont antérieures à la date et l'heure actuelles, le lot est automatiquement tourné et le processus de mise à jour vers l'état "public" est décrit.

J'écrirai sur la façon de créer une tâche Rake qui active la mise à jour ci-dessus et d'exécuter également ce processus en utilisant à chaque fois.

Qu'est-ce qu'une tâche Rake en premier lieu?

Rake est un outil de construction simple qui vous permet de décrire le contenu du traitement dans Ruby. Ce contenu de traitement écrit en Ruby est appelé une tâche Rake et peut être exécuté en le définissant dans un Rakefile.

Création et mise en œuvre de tâches Rake

Un fichier sera créé dans lib / tasks en tapant $ rails generate task nom de tâche.

$ rails generate task status_task

Entrez le processus que vous souhaitez exécuter dans article.rb et le fichier créé.

article.rb


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

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

Dans article.rb, défini à l'origine seulement deux types d'énumération, "brouillon" et "publier", ajoutez donc publish_wait de "en attente de publication". Définissez la plage de past_published dans la portée comme la date et l'heure de publication antérieures à l'heure actuelle.

status_task.rake



namespace :status_task do
  desc 'S'il y a une liste d'attente dont la date et l'heure de publication sont dans le passé, le statut sera changé en "public".'
  task update_status_task: :environment do
    Article.publish_wait.past_published.find_each(&:published!)
  end
end

Obtenez l'article "en attente de publication" avec Article.publish_wait et mettez à jour le statut de past_published en "publié" avec Published! Par défaut, find_each acquiert 1000 enregistrements à la fois et traite les données acquises un par un, de sorte que la vitesse d'exécution du traitement est moins susceptible de ralentir par rapport à find, qui traite après l'acquisition de toutes les données.

Présentation à tout moment

Ensuite, nous présenterons chaque fois pour exécuter la tâche Rake créée jusqu'à présent toutes les heures. chaque fois qu'une bibliothèque est préparée dans des rails pour gérer le temps de traitement des lots périodiques, et à l'origine il est nécessaire de préparer un processus appelé cron qui "exécute XX à XX temps". Si vous utilisez, à chaque fois, vous pourrez écrire le contenu décrit dans crontab qui donne des instructions à cron en langage ruby.

Cela vous permet de définir la tâche Rake pour qu'elle s'exécute toutes les heures.

Tout d'abord, j'écrirai à partir de la méthode d'introduction.

gem 'whenever'

Si vous effectuez une installation groupée et exécutez ce qui suit, un fichier appelé cofig / schedule.rb sera créé.

$bundle exec wheneverize .

Écrivez le processus pour exécuter la tâche Rake toutes les heures dans ce schedule.rb.

config/schedule.rb



# Rails.Requis pour utiliser root
require File.expand_path(File.dirname(__FILE__) + "/environment")
#Variables d'environnement pour exécuter cron
rails_env = ENV['RAILS_ENV'] || :development
#Définir les variables d'environnement pour exécuter cron
set :environment, rails_env
#emplacement de la broche du journal cron
set :output, "#{Rails.root}/log/cron.log"
#Exécuter la tâche de râteau toutes les heures
every :hour do
  rake 'article_state:update_article_state'
end

Rendre possible de définir la date et l'heure de publication uniquement toutes les heures.

app/assets/javascripts/admin.js



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

mise à jour cron

Avant de refléter les paramètres écrits dans schedule.rb, vérifiez d'abord le contenu mis à jour sans réécrire cron.

$ bundle exec whenever

S'il n'y a pas de problème avec les paramètres, mettez à jour crontab ci-dessous.

$ bundle exec whenever --update-crontab 

Vérifiez si la tâche Rake peut être exécutée sans problème avec la commande suivante.

$ rake status_task:update_status_task

C'est tout.

Liste des pages référencées

[Manuel de référence de Ruby 2.7.0 / Liste des bibliothèques / Bibliothèque de rake] https://docs.ruby-lang.org/ja/latest/library/rake.html

[Document Rails find_each] https://railsdoc.com/page/find_each

[Si vous souhaitez mettre à jour une grande quantité de données dans un lot avec Rails, utilisez find_each] http://blog.livedoor.jp/sasata299/archives/51882704.html

[Rails chaque fois que la méthode spécifiée] https://taker.hatenablog.com/entry/2019/12/02/195950

Recommended Posts

[Rails] Mise à jour de l'état à l'aide de la tâche Rake
[Rails] Mettre en œuvre la tâche de râteau
Rails: comment bien écrire une tâche de râteau
Empêcher les opérations! Méthode de mise à jour manuelle sûre des données pour Rails utilisant des transactions
À propos de l'exécution régulière de la tâche de râteau de l'application de rails dans Heroku
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
Fonction de recherche à l'aide de [rails] ransack
[Rails] Enregistrez des images à l'aide de carrierwave
Japaneseize en utilisant i18n avec Rails
[Rails] Localisation japonaise à l'aide de rails-i18n
Définissons une tâche Rake.
[Rails] Code de test à l'aide de Rspec
Erreur lors de l'utilisation des rails capybara
[Rails] Essayez d'utiliser le middleware de Faraday
Conseils détaillés lors de l'utilisation de Rails
[Rails 6] Revue en forme d'étoile utilisant Raty.js