Skip to content

Commit d4a395d

Browse files
zetter-rpfCopilot
andcommitted
Avoid N+1 queries when loading submitted counts
Co-authored-by: Copilot <copilot@github.com>
1 parent 97da614 commit d4a395d

4 files changed

Lines changed: 15 additions & 6 deletions

File tree

app/controllers/api/lessons_controller.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ class LessonsController < ApiController
1111
def index
1212
accessible_lessons = filtered_lessons_scope
1313
.accessible_by(current_ability)
14-
.includes(project: :remixes)
15-
@lessons_with_users = accessible_lessons.with_users
1614

1715
if current_user&.school_teacher?(school) || current_user&.school_owner?(school)
16+
accessible_lessons = accessible_lessons.includes(project: { remixes: %i[submitted_school_projects] })
17+
@lessons_with_users = accessible_lessons.with_users
1818
render :teacher_index, formats: [:json], status: :ok
1919
else
2020
remixes = user_remixes(accessible_lessons)
21+
accessible_lessons = accessible_lessons.includes(project: :remixes)
22+
@lessons_with_users = accessible_lessons.with_users
2123
@lessons_with_users_and_remixes = @lessons_with_users.zip(remixes)
2224
render :student_index, formats: [:json], status: :ok
2325
end

app/models/lesson.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def with_user
3535
def submitted_count
3636
return 0 unless project
3737

38-
project.remixes.count { |remix| remix.school_project&.submitted? }
38+
project.remixes.sum { |r| r.submitted_school_projects.length }
3939
end
4040

4141
private

app/models/project.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module Types
1919
has_many_attached :videos
2020
has_many_attached :audio
2121
has_one :school_project, dependent: :destroy
22+
has_many :submitted_school_projects, -> { in_state(:submitted) }, class_name: 'SchoolProject'
2223

2324
accepts_nested_attributes_for :components
2425
accepts_nested_attributes_for :scratch_component

spec/features/lesson/listing_lessons_spec.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,20 @@
8686
end
8787

8888
it 'includes the submitted_count for each lesson' do
89+
student_2 = create(:student, school:)
90+
create(:class_student, school_class:, student_id: student_2.id)
91+
8992
lesson.update!(school_class_id: school_class.id)
90-
remix = create(:project, school:, remixed_from_id: lesson.project.id, user_id: student.id)
91-
remix.school_project.transition_status_to!(:submitted, student.id)
93+
94+
[student, student_2].each do |student|
95+
remix = create(:project, school:, remixed_from_id: lesson.project.id, user_id: student.id)
96+
remix.school_project.transition_status_to!(:submitted, student.id)
97+
end
9298

9399
get("/api/lessons?school_class_id=#{school_class.id}", headers:)
94100
data = JSON.parse(response.body, symbolize_names: true)
95101

96-
expect(data.first[:submitted_count]).to eq(1)
102+
expect(data.first[:submitted_count]).to eq(2)
97103
end
98104

99105
context 'when filtering by project_identifier' do

0 commit comments

Comments
 (0)