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