Refactor average worktime and add it to exercise statistics per user
This commit is contained in:
@ -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
|
||||||
|
@ -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})"
|
|
||||||
|
Reference in New Issue
Block a user