Reduce SQL queries for exercise batch update

Fixes CODEOCEAN-10D
This commit is contained in:
Sebastian Serth
2023-12-05 21:39:52 +01:00
parent ae75d1ea3a
commit dccfe5cbc8
2 changed files with 13 additions and 7 deletions

View File

@ -39,12 +39,17 @@ class ExercisesController < ApplicationController
end end
def batch_update 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! authorize!
@exercises = params[:exercises].values.map do |exercise_params|
exercise = Exercise.find(exercise_params.delete(:id)) @exercises.each do |exercise|
exercise.update(exercise_params.permit(:public)) exercise.update(public: update_map[exercise.id.to_s])
exercise
end end
render(json: {exercises: @exercises}) render(json: {exercises: @exercises})
end end

View File

@ -14,8 +14,9 @@ RSpec.describe ExercisesController do
end end
describe 'PUT #batch_update' do describe 'PUT #batch_update' do
let(:attributes) { ActionController::Parameters.new(public: 'true').permit! } let(:attributes) { {public: 'true'} }
let(:perform_request) { proc { put :batch_update, params: {exercises: {0 => attributes.merge(id: exercise.id)}} } } 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 } before { perform_request.call }