From dccfe5cbc86974ead2d38c8d6fee534cd9802e5c Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Tue, 5 Dec 2023 21:39:52 +0100 Subject: [PATCH] Reduce SQL queries for exercise batch update Fixes CODEOCEAN-10D --- app/controllers/exercises_controller.rb | 15 ++++++++++----- spec/controllers/exercises_controller_spec.rb | 5 +++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index b8eedfe8..81609952 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -39,12 +39,17 @@ class ExercisesController < ApplicationController end def batch_update - @exercises = Exercise.all + update_map = {} + update_params = params.permit(exercises: %i[id public]) + update_params[:exercises].each_value do |param| + update_map[param[:id]] = param[:public] + end + + @exercises = Exercise.where(id: update_map.keys).includes(:execution_environment, :files) authorize! - @exercises = params[:exercises].values.map do |exercise_params| - exercise = Exercise.find(exercise_params.delete(:id)) - exercise.update(exercise_params.permit(:public)) - exercise + + @exercises.each do |exercise| + exercise.update(public: update_map[exercise.id.to_s]) end render(json: {exercises: @exercises}) end diff --git a/spec/controllers/exercises_controller_spec.rb b/spec/controllers/exercises_controller_spec.rb index ffd7a0e1..01edfadb 100644 --- a/spec/controllers/exercises_controller_spec.rb +++ b/spec/controllers/exercises_controller_spec.rb @@ -14,8 +14,9 @@ RSpec.describe ExercisesController do end describe 'PUT #batch_update' do - let(:attributes) { ActionController::Parameters.new(public: 'true').permit! } - let(:perform_request) { proc { put :batch_update, params: {exercises: {0 => attributes.merge(id: exercise.id)}} } } + let(:attributes) { {public: 'true'} } + let(:params) { ActionController::Parameters.new(public: 'true').permit! } + let(:perform_request) { proc { put :batch_update, params: {exercises: {0 => params.merge(id: exercise.id)}} } } before { perform_request.call }