diff --git a/app/models/exercise.rb b/app/models/exercise.rb index e7dba16d..192c4513 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -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 diff --git a/app/views/exercises/statistics.html.slim b/app/views/exercises/statistics.html.slim index 99e6ead2..f4a9dde5 100644 --- a/app/views/exercises/statistics.html.slim +++ b/app/views/exercises/statistics.html.slim @@ -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