Skip to content

Commit a6f0c1e

Browse files
committed
Modifying sorting query
1 parent 8ace901 commit a6f0c1e

File tree

1 file changed

+31
-24
lines changed

1 file changed

+31
-24
lines changed

app/controllers/submissions_controller.rb

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)