Skip to content

Commit 8aae49d

Browse files
committed
Simplify and attempt fix n+1
1 parent d811c4f commit 8aae49d

1 file changed

Lines changed: 16 additions & 24 deletions

File tree

app/controllers/api/school_classes_controller.rb

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -90,30 +90,22 @@ def render_student_index(school_classes)
9090
end
9191

9292
def calculate_unread_counts(school_classes)
93-
school_classes.map do |school_class|
94-
lessons = school_class.lessons.accessible_by(current_ability)
95-
remixes = user_remixes_for_lessons(lessons)
96-
97-
remixes.count do |remix|
98-
remix&.school_project&.feedback&.exists?(read_at: nil)
99-
end
100-
end
101-
end
102-
103-
def user_remixes_for_lessons(lessons)
104-
lessons.filter_map do |lesson|
105-
next nil unless lesson&.project&.remixes&.exists?
106-
107-
user_remix_for_lesson(lesson)
108-
end
109-
end
110-
111-
def user_remix_for_lesson(lesson)
112-
lesson.project&.remixes&.where(user_id: current_user.id)
113-
&.accessible_by(current_ability)
114-
&.order(created_at: :asc)
115-
&.includes(school_project: :feedback)
116-
&.first
93+
class_ids = school_classes.map(&:id)
94+
95+
# Count unread feedback per class in a single query
96+
counts_by_class_id =
97+
Feedback
98+
.joins(school_project: { project: { lesson: :school_class } })
99+
.where(
100+
read_at: nil,
101+
projects: { user_id: current_user.id },
102+
school_classes: { id: class_ids }
103+
)
104+
.group('school_classes.id')
105+
.count
106+
107+
# Return counts in the same order as school_classes
108+
school_classes.map { |school_class| counts_by_class_id[school_class.id] || 0 }
117109
end
118110

119111
def find_or_create_school_class(school_class_params)

0 commit comments

Comments
 (0)