Only ask for feedback from fast users if they achieved an above-average score
This commit is contained in:
@ -69,14 +69,17 @@ class Exercise < ActiveRecord::Base
|
|||||||
"
|
"
|
||||||
SELECT user_id,
|
SELECT user_id,
|
||||||
user_type,
|
user_type,
|
||||||
sum(working_time_new) AS working_time
|
SUM(working_time_new) AS working_time,
|
||||||
|
MAX(score) AS score
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id,
|
(SELECT user_id,
|
||||||
user_type,
|
user_type,
|
||||||
|
score,
|
||||||
CASE WHEN working_time >= '0:05:00' THEN '0' ELSE working_time END AS working_time_new
|
CASE WHEN working_time >= '0:05:00' THEN '0' ELSE working_time END AS working_time_new
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id,
|
(SELECT user_id,
|
||||||
user_type,
|
user_type,
|
||||||
|
score,
|
||||||
id,
|
id,
|
||||||
(created_at - lag(created_at) over (PARTITION BY user_id, exercise_id
|
(created_at - lag(created_at) over (PARTITION BY user_id, exercise_id
|
||||||
ORDER BY created_at)) AS working_time
|
ORDER BY created_at)) AS working_time
|
||||||
|
@ -147,9 +147,11 @@ namespace :detect_exercise_anomalies do
|
|||||||
|
|
||||||
def performers_by_time(exercise, n)
|
def performers_by_time(exercise, n)
|
||||||
working_times = get_user_working_times(exercise).values.map do |item|
|
working_times = get_user_working_times(exercise).values.map do |item|
|
||||||
{user_id: item['user_id'], user_type: item['user_type'], value: time_to_f(item['working_time']), reason: 'time'}
|
{user_id: item['user_id'], user_type: item['user_type'], score: item['score'].to_f,
|
||||||
|
value: time_to_f(item['working_time']), reason: 'time'}
|
||||||
end
|
end
|
||||||
working_times.reject! {|item| item[:value].nil? or item[:value] <= MIN_USER_WORKING_TIME}
|
avg_score = exercise.average_score
|
||||||
|
working_times.reject! {|item| item[:value].nil? or item[:value] <= MIN_USER_WORKING_TIME or item[:score] < avg_score}
|
||||||
working_times.sort_by! {|item| item[:value]}
|
working_times.sort_by! {|item| item[:value]}
|
||||||
return {:best => working_times.first(n), :worst => working_times.last(n)}
|
return {:best => working_times.first(n), :worst => working_times.last(n)}
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user