Extract last submission per user to Exercise model
This commit is contained in:
@ -368,4 +368,14 @@ class Exercise < ActiveRecord::Base
|
|||||||
user_exercise_feedbacks.size <= MAX_EXERCISE_FEEDBACKS
|
user_exercise_feedbacks.size <= MAX_EXERCISE_FEEDBACKS
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def last_submission_per_user
|
||||||
|
Submission.joins("JOIN (
|
||||||
|
SELECT
|
||||||
|
user_id,
|
||||||
|
first_value(id) OVER (PARTITION BY user_id ORDER BY created_at DESC) AS fv
|
||||||
|
FROM submissions
|
||||||
|
WHERE exercise_id = #{id}
|
||||||
|
) AS t ON t.fv = submissions.id").distinct
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -76,19 +76,10 @@ namespace :detect_exercise_anomalies do
|
|||||||
def notify_users(collection, anomalies)
|
def notify_users(collection, anomalies)
|
||||||
puts "\t\tSending E-Mails to best and worst performing users of each anomaly..."
|
puts "\t\tSending E-Mails to best and worst performing users of each anomaly..."
|
||||||
anomalies.each do |exercise_id, average_working_time|
|
anomalies.each do |exercise_id, average_working_time|
|
||||||
submissions = Submission.find_by_sql(['
|
submissions = Exercise.find(exercise_id)
|
||||||
select distinct s.*
|
.last_submission_per_user
|
||||||
from
|
.where('score is not null')
|
||||||
(
|
.order(:score)
|
||||||
select
|
|
||||||
user_id,
|
|
||||||
first_value(id) over (partition by user_id order by created_at desc) as fv
|
|
||||||
from submissions
|
|
||||||
where exercise_id = ?
|
|
||||||
) as t
|
|
||||||
join submissions s on s.id = t.fv
|
|
||||||
where score is not null
|
|
||||||
order by score', exercise_id])
|
|
||||||
best_performers = submissions.first(10).to_a.map do |item|
|
best_performers = submissions.first(10).to_a.map do |item|
|
||||||
item.user_id
|
item.user_id
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user