Rails: 5.2.3 Ruby: 2.6.3 MySQL: 5.6.40
question_count de la table ʻusers` n'est pas mise à jour.
J'ai créé un lot et j'ai rendu possible la mise à jour à la valeur correcte dans un lot.
«Parce que vous utilisez une méthode existante, cela peut être difficile à comprendre, mais pardonnez-moi s'il vous plaît.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
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
bundle exec rake user:update_question_count
――Il a fallu environ 45 secondes pour mettre à jour environ 19 000 enregistrements.

Recommended Posts