[RUBY] [Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake

introduction

environnement

Rails: 5.2.3 Ruby: 2.6.3 MySQL: 5.6.40

Contenu

user.rb


has_many :questions, dependent: false
has_many :only_questions_visible_to_user, -> { where(question_id: nil).visible_to_user }, class_name: 'Question', dependent: false

scope :visible_to_user, -> { where(is_invalid: false).where(deleted: false) }

def update_question_count!
  update!(question_count: count_questions)
end

private

# question_Méthode utilisée pour l'agrégation lors de la mise à jour du nombre
#
# @return [Integer]
def count_questions
  only_questions_visible_to_user.size
end

question.rb


belongs_to :user, optional: true

Code implémenté

lib/tasks/one_shot/update_users_question_count.rake


# frozen_string_literal: true

namespace :user do
  desc 'Update users_question_count'
  task update_question_count: :environment do |_task|
    index = 0
    updated_question_counts = 0
    user_count = User.count
    logger = Logger.new($stdout)
    logger.info 'Start'

    User.find_each do |user|
      begin
        if user.question_count != user.only_questions_visible_to_user.size
          user.update_question_count!
          updated_question_counts += 1
        end
      rescue ActiveRecord::RecordInvalid => e
        logger.info "Failed to update user_id: #{user.id}"
        logger.info("#{e.class}: #{e.message}")
        next
      end

      index += 1
      case index
      when 4000, 8000, 12_000, 16_000
        logger.info "Progress: #{index}/#{user_count}"
      end
    end
    logger.info "Updated User Count: #{updated_user_counts}"
    logger.info 'Finished'
  end
end

Exécution par lots

bundle exec rake user:update_question_count

――Il a fallu environ 45 secondes pour mettre à jour environ 19 000 enregistrements.

Recommended Posts

[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
[Rails] Mettre en œuvre la tâche de râteau
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé d'implémenter Sterling Sort avec Java Collector
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
[Rails] J'ai essayé de créer une mini application avec FullCalendar
J'ai essayé d'interagir avec Java
J'ai essayé d'implémenter un mappage OU flexible avec MyBatis Dynamic SQL
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai essayé de migrer le traitement vers VS Code
J'ai essayé de démarrer avec Web Assembly
J'ai essayé d'implémenter le modèle Iterator
[Rails] J'ai essayé d'implémenter une transaction qui combine plusieurs processus DB
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
Rails: comment bien écrire une tâche de râteau
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de faire une authentification de base avec Java
J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
J'ai essayé de gérer la configuration des jambes de force avec Coggle
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé de gérer les informations de connexion avec JMX
Je veux jouer avec Firestore de Rails
Les débutants de Rails ont essayé de se lancer avec RSpec
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé de casser le bloc avec java (1)
Mode API Rails J'ai essayé d'implémenter la fonction de recherche multiple par mot-clé à l'aide de tableaux et d'un traitement itératif.
Je souhaite effectuer un traitement d'agrégation avec spring-batch
[Rails] Je veux charger du CSS avec webpacker
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
J'ai essayé Spring Batch
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai essayé d'implémenter la notification push Firebase en Java
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé de démarrer avec Spring Data JPA
Je souhaite authentifier les utilisateurs auprès de Rails avec Devise + OmniAuth
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
Rails6 J'ai essayé d'introduire Docker dans une application existante
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
Notez que j'étais accro au traitement par lots avec Spring Boot
[Swift] J'ai essayé d'implémenter une interface utilisateur semblable à un profil Instagram avec UICollectionView avec juste du code sans storyboard
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé DI avec Ruby
Je veux pousser une application créée avec Rails 6 vers GitHub