Push statistics features to model
This commit is contained in:
@ -23,14 +23,19 @@ class Exercise < ActiveRecord::Base
|
|||||||
validates :token, presence: true, uniqueness: true
|
validates :token, presence: true, uniqueness: true
|
||||||
|
|
||||||
def average_percentage
|
def average_percentage
|
||||||
(average_score/ maximum_score * 100).round if average_score
|
(average_score / maximum_score * 100).round if average_score
|
||||||
end
|
end
|
||||||
|
|
||||||
def average_score
|
def average_score
|
||||||
if submissions.exists?(cause: 'submit')
|
if submissions.exists?(cause: 'submit')
|
||||||
maximum_scores_query = submissions.select('MAX(score) AS maximum_score').where(cause: 'submit').group(:user_id).to_sql.sub('$1', id.to_s)
|
maximum_scores_query = submissions.select('MAX(score) AS maximum_score').where(cause: 'submit').group(:user_id).to_sql.sub('$1', id.to_s)
|
||||||
self.class.connection.execute("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f
|
self.class.connection.execute("SELECT AVG(maximum_score) AS average_score FROM (#{maximum_scores_query}) AS maximum_scores").first['average_score'].to_f
|
||||||
end
|
else 0 end
|
||||||
|
end
|
||||||
|
|
||||||
|
def average_working_time
|
||||||
|
working_time_query = submissions.select('MAX(created_at) - MIN(created_at) AS time').group(:user_id).to_sql.sub('$1', id.to_s)
|
||||||
|
self.class.connection.execute("SELECT AVG(time) AS average_time FROM (#{working_time_query}) AS working_times").first['average_time']
|
||||||
end
|
end
|
||||||
|
|
||||||
def duplicate(attributes = {})
|
def duplicate(attributes = {})
|
||||||
|
@ -9,15 +9,7 @@ h1 = @execution_environment
|
|||||||
tbody
|
tbody
|
||||||
- @execution_environment.exercises.each do |exercise|
|
- @execution_environment.exercises.each do |exercise|
|
||||||
tr
|
tr
|
||||||
- submissions = exercise.submissions
|
|
||||||
td = exercise.title
|
td = exercise.title
|
||||||
td = submissions.average(:score)
|
td = exercise.average_score
|
||||||
td = submissions.count()
|
td = exercise.submissions.count()
|
||||||
- minima = submissions.group(:user_id).minimum(:created_at)
|
td = exercise.average_working_time
|
||||||
- maxima = submissions.group(:user_id).maximum(:created_at)
|
|
||||||
- result = 0
|
|
||||||
- results = {}
|
|
||||||
- maxima.each {|key, value| results[key] = value - minima[key]}
|
|
||||||
- results.values.map {|value| result += value}
|
|
||||||
- result /= results.size if results.size > 0
|
|
||||||
td = distance_of_time_in_words(result)
|
|
||||||
|
Reference in New Issue
Block a user