Refactor average worktime and add it to exercise statistics per user

This commit is contained in:
Maximilian Grundke
2015-11-05 11:17:45 +01:00
parent d4031c363f
commit f3acc426ac
2 changed files with 27 additions and 15 deletions

View File

@ -42,11 +42,9 @@ class Exercise < ActiveRecord::Base
return user_count == 0 ? 0 : submissions.count() / user_count.to_f() return user_count == 0 ? 0 : submissions.count() / user_count.to_f()
end end
def average_working_time def user_working_time_query
self.class.connection.execute(""" """
SELECT avg(working_time) as average_time SELECT user_id,
FROM
(SELECT user_id,
sum(working_time_new) AS working_time sum(working_time_new) AS working_time
FROM FROM
(SELECT user_id, (SELECT user_id,
@ -58,10 +56,25 @@ class Exercise < ActiveRecord::Base
ORDER BY id)) AS working_time ORDER BY id)) AS working_time
FROM submissions FROM submissions
WHERE exercise_id=#{id}) AS foo) AS bar WHERE exercise_id=#{id}) AS foo) AS bar
GROUP BY user_id) AS baz; GROUP BY user_id
"""
end
def average_working_time
self.class.connection.execute("""
SELECT avg(working_time) as average_time
FROM
(#{user_working_time_query}) AS baz;
""").first['average_time'] """).first['average_time']
end 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 = {}) def duplicate(attributes = {})
exercise = dup exercise = dup
exercise.attributes = attributes exercise.attributes = attributes

View File

@ -23,5 +23,4 @@ h1 = @exercise
td = "#{user.name} (#{user.email})" td = "#{user.name} (#{user.email})"
td = submissions.maximum('score') td = submissions.maximum('score')
td = submissions.count('id') td = submissions.count('id')
- seconds = submissions.maximum('created_at') - submissions.minimum('created_at') td = @exercise.average_working_time_for(user.id) or 0
td = "#{distance_of_time_in_words(seconds)} (#{seconds})"