fix performance regression in gradebook csv

fixes CNVS-5492

test plan (external):
- download the gradebook csv with and without sis ids
- it should still work

test plan (internal):
- run gradebook csv with sis ids from the console and watch the db queries
- it should not load quiz submissions
- it should not load the account once per student

Change-Id: I2665041d8733856d8b32547b49d5af5b69292076
Reviewed-on: https://gerrit.instructure.com/20007
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Cameron Matheson <cameron@instructure.com>
Reviewed-by: Stanley Stuart <stanley@instructure.com>
QA-Review: Amber Taniuchi <amber@instructure.com>
Product-Review: Simon Williams <simon@instructure.com>
This commit is contained in:
Simon Williams 2013-04-23 20:54:10 -06:00
parent 450d433167
commit b35b70580d
2 changed files with 6 additions and 2 deletions

View File

@ -1376,8 +1376,12 @@ class Course < ActiveRecord::Base
end end
def gradebook_to_csv(options = {}) def gradebook_to_csv(options = {})
# user: used for name in csv output
# course_section: used for display_name in csv output
# user > pseudonyms: used for sis_user_id/unique_id if options[:include_sis_id]
# user > pseudonyms > account: used in find_pseudonym_for_account > works_for_account
includes = [:user, :course_section] includes = [:user, :course_section]
includes = {:user => :pseudonyms, :course_section => []} if options[:include_sis_id] includes = {:user => {:pseudonyms => :account}, :course_section => []} if options[:include_sis_id]
scope = options[:user] ? self.enrollments_visible_to(options[:user]) : self.student_enrollments scope = options[:user] ? self.enrollments_visible_to(options[:user]) : self.student_enrollments
student_enrollments = scope.includes(includes).order_by_sortable_name # remove duplicate enrollments for students enrolled in multiple sections student_enrollments = scope.includes(includes).order_by_sortable_name # remove duplicate enrollments for students enrolled in multiple sections
student_enrollments = student_enrollments.all.uniq_by(&:user_id) student_enrollments = student_enrollments.all.uniq_by(&:user_id)

View File

@ -44,7 +44,7 @@ class GradeCalculator
# recomputes the scores and saves them to each user's Enrollment # recomputes the scores and saves them to each user's Enrollment
def compute_scores def compute_scores
@submissions = @course.submissions.for_user(@user_ids) @submissions = @course.submissions.except(:includes).for_user(@user_ids)
submissions_by_user = @submissions.group_by(&:user_id) submissions_by_user = @submissions.group_by(&:user_id)
@user_ids.map do |user_id| @user_ids.map do |user_id|
user_submissions = submissions_by_user[user_id] || [] user_submissions = submissions_by_user[user_id] || []