Skip to content

Commit dccfe5c

Browse files
committed
Reduce SQL queries for exercise batch update
Fixes CODEOCEAN-10D
1 parent ae75d1e commit dccfe5c

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

app/controllers/exercises_controller.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,17 @@ def max_intervention_count_per_exercise
3939
end
4040

4141
def batch_update
42-
@exercises = Exercise.all
42+
update_map = {}
43+
update_params = params.permit(exercises: %i[id public])
44+
update_params[:exercises].each_value do |param|
45+
update_map[param[:id]] = param[:public]
46+
end
47+
48+
@exercises = Exercise.where(id: update_map.keys).includes(:execution_environment, :files)
4349
authorize!
44-
@exercises = params[:exercises].values.map do |exercise_params|
45-
exercise = Exercise.find(exercise_params.delete(:id))
46-
exercise.update(exercise_params.permit(:public))
47-
exercise
50+
51+
@exercises.each do |exercise|
52+
exercise.update(public: update_map[exercise.id.to_s])
4853
end
4954
render(json: {exercises: @exercises})
5055
end

spec/controllers/exercises_controller_spec.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
end
1515

1616
describe 'PUT #batch_update' do
17-
let(:attributes) { ActionController::Parameters.new(public: 'true').permit! }
18-
let(:perform_request) { proc { put :batch_update, params: {exercises: {0 => attributes.merge(id: exercise.id)}} } }
17+
let(:attributes) { {public: 'true'} }
18+
let(:params) { ActionController::Parameters.new(public: 'true').permit! }
19+
let(:perform_request) { proc { put :batch_update, params: {exercises: {0 => params.merge(id: exercise.id)}} } }
1920

2021
before { perform_request.call }
2122

0 commit comments

Comments
 (0)