@@ -49,35 +49,47 @@ def index
4949 }
5050
5151 order_column = columns_map [ order_column_index ] || 'submissions.created_at'
52+
5253 base_query = @assessment . submissions
5354 . joins ( course_user_datum : :user )
55+
5456 if search_value . present?
5557 base_query = base_query . where (
5658 "users.email LIKE :search" ,
5759 search : "%#{ search_value } %"
5860 )
5961 end
62+
6063 total_records = @assessment . submissions . count
6164 filtered_records = base_query . count
62- submissions_query = base_query
63- . includes ( course_user_datum : :user )
64- . left_joins ( :scores )
65- . select ( 'submissions.*' )
66- . select ( 'COALESCE(SUM(scores.score), 0) as calculated_score' )
67- . group ( 'submissions.id' )
68-
69- # Apply sorting
70- submissions_query =
71- if order_column == 'calculated_score'
72- submissions_query . order ( "calculated_score #{ order_direction } " )
73- else
74- submissions_query . order ( "#{ order_column } #{ order_direction } " )
65+
66+ # If sorting by score, we have to load the data into ruby b/c we don't stored
67+ # final scores in our database
68+ if order_column == 'calculated_score'
69+ all_submissions = base_query . includes ( course_user_datum : :user ) . to_a
70+ submissions_with_scores = all_submissions . map do |submission |
71+ cud = submission . course_user_datum
72+ [ submission , submission . final_score ( cud ) ]
7573 end
76- # Apply pagination
77- submissions = submissions_query . limit ( length ) . offset ( start )
74+ sorted_submissions = submissions_with_scores . sort_by { |_ , score | score }
75+ sorted_submissions . reverse! if order_direction == 'desc'
76+ paginated_submissions = sorted_submissions [ start , length ] || [ ]
7877
79- data = submissions . map do |submission |
80- format_submission_for_datatable ( submission )
78+ data = paginated_submissions . map do |submission , score |
79+ format_submission_for_datatable ( submission , score )
80+ end
81+ else
82+ submissions = base_query
83+ . includes ( course_user_datum : :user )
84+ . order ( "#{ order_column } #{ order_direction } " )
85+ . limit ( length )
86+ . offset ( start )
87+
88+ data = submissions . map do |submission |
89+ cud = submission . course_user_datum
90+ score = submission . final_score ( cud )
91+ format_submission_for_datatable ( submission , score )
92+ end
8193 end
8294
8395 render json : {
@@ -91,16 +103,11 @@ def index
91103 end
92104
93105 action_auth_level :format_submission_for_datatable , :instructor
94- def format_submission_for_datatable ( submission )
106+ def format_submission_for_datatable ( submission , score = nil )
95107 cud = submission . course_user_datum
96108 user = cud . user
97109 excused = @excused_cids . include? ( cud . id )
98- score =
99- if submission . respond_to? ( :calculated_score )
100- submission . calculated_score
101- else
102- submission . final_score ( cud )
103- end
110+ score ||= submission . final_score ( cud )
104111 [
105112 '' ,
106113 {
0 commit comments