Refactor average worktime and add it to exercise statistics per user
This commit is contained in:
@ -42,26 +42,39 @@ class Exercise < ActiveRecord::Base
|
||||
return user_count == 0 ? 0 : submissions.count() / user_count.to_f()
|
||||
end
|
||||
|
||||
def user_working_time_query
|
||||
"""
|
||||
SELECT user_id,
|
||||
sum(working_time_new) AS working_time
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
CASE WHEN working_time >= '0:30:00' THEN '0' ELSE working_time END AS working_time_new
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
id,
|
||||
(created_at - lag(created_at) over (PARTITION BY user_id
|
||||
ORDER BY id)) AS working_time
|
||||
FROM submissions
|
||||
WHERE exercise_id=#{id}) AS foo) AS bar
|
||||
GROUP BY user_id
|
||||
"""
|
||||
end
|
||||
|
||||
def average_working_time
|
||||
self.class.connection.execute("""
|
||||
SELECT avg(working_time) as average_time
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
sum(working_time_new) AS working_time
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
CASE WHEN working_time >= '0:30:00' THEN '0' ELSE working_time END AS working_time_new
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
id,
|
||||
(created_at - lag(created_at) over (PARTITION BY user_id
|
||||
ORDER BY id)) AS working_time
|
||||
FROM submissions
|
||||
WHERE exercise_id=#{id}) AS foo) AS bar
|
||||
GROUP BY user_id) AS baz;
|
||||
(#{user_working_time_query}) AS baz;
|
||||
""").first['average_time']
|
||||
end
|
||||
|
||||
def average_working_time_for(user_id)
|
||||
self.class.connection.execute("""
|
||||
#{user_working_time_query}
|
||||
HAVING user_id = #{user_id}
|
||||
""").first['working_time']
|
||||
end
|
||||
|
||||
def duplicate(attributes = {})
|
||||
exercise = dup
|
||||
exercise.attributes = attributes
|
||||
|
@ -23,5 +23,4 @@ h1 = @exercise
|
||||
td = "#{user.name} (#{user.email})"
|
||||
td = submissions.maximum('score')
|
||||
td = submissions.count('id')
|
||||
- seconds = submissions.maximum('created_at') - submissions.minimum('created_at')
|
||||
td = "#{distance_of_time_in_words(seconds)} (#{seconds})"
|
||||
td = @exercise.average_working_time_for(user.id) or 0
|
||||
|
Reference in New Issue
Block a user