added reason vor proxy exercise

This commit is contained in:
Thomas Hille
2017-03-02 16:16:27 +01:00
parent a481ec0da8
commit 7ef318713b
2 changed files with 16 additions and 1 deletions

View File

@ -1,6 +1,7 @@
class ProxyExercise < ActiveRecord::Base class ProxyExercise < ActiveRecord::Base
after_initialize :generate_token after_initialize :generate_token
after_initialize :set_reason
has_and_belongs_to_many :exercises has_and_belongs_to_many :exercises
has_many :user_proxy_exercise_exercises has_many :user_proxy_exercise_exercises
@ -9,6 +10,10 @@ class ProxyExercise < ActiveRecord::Base
exercises.count exercises.count
end end
def set_reason
@reason = {}
end
def generate_token def generate_token
self.token ||= SecureRandom.hex(4) self.token ||= SecureRandom.hex(4)
end end
@ -37,9 +42,11 @@ class ProxyExercise < ActiveRecord::Base
find_matching_exercise(user) find_matching_exercise(user)
rescue #fallback rescue #fallback
Rails.logger.error("finding matching exercise failed. Fall back to random exercise! Error: #{$!}" ) Rails.logger.error("finding matching exercise failed. Fall back to random exercise! Error: #{$!}" )
@reason[:reason] = "fallback because of error"
@reason[:error] = "#{$!}"
exercises.shuffle.first exercises.shuffle.first
end end
user.user_proxy_exercise_exercises << UserProxyExerciseExercise.create(user: user, exercise: matching_exercise, proxy_exercise: self) user.user_proxy_exercise_exercises << UserProxyExerciseExercise.create(user: user, exercise: matching_exercise, proxy_exercise: self, reason: @reason.to_json)
matching_exercise matching_exercise
end end
recommended_exercise recommended_exercise
@ -61,6 +68,8 @@ class ProxyExercise < ActiveRecord::Base
Rails.logger.info("potential_recommended_exercises: #{potential_recommended_exercises.map{|e|e.id}}") Rails.logger.info("potential_recommended_exercises: #{potential_recommended_exercises.map{|e|e.id}}")
# if all exercises contain tags which the user has never seen, recommend easiest exercise # if all exercises contain tags which the user has never seen, recommend easiest exercise
if potential_recommended_exercises.empty? if potential_recommended_exercises.empty?
Rails.logger.info("matched easiest exercise in pool")
@reason[:reason] = "easiest exercise in pool. empty potential exercises"
select_easiest_exercise(exercises) select_easiest_exercise(exercises)
else else
recommended_exercise = select_best_matching_exercise(user, exercises_user_has_accessed, potential_recommended_exercises) recommended_exercise = select_best_matching_exercise(user, exercises_user_has_accessed, potential_recommended_exercises)
@ -96,6 +105,11 @@ class ProxyExercise < ActiveRecord::Base
end end
highest_difficulty_user_has_accessed = exercises_user_has_accessed.map{|e| e.expected_difficulty}.sort.last || 0 highest_difficulty_user_has_accessed = exercises_user_has_accessed.map{|e| e.expected_difficulty}.sort.last || 0
best_matching_exercise = find_best_exercise(relative_knowledge_improvement, highest_difficulty_user_has_accessed) best_matching_exercise = find_best_exercise(relative_knowledge_improvement, highest_difficulty_user_has_accessed)
@reason[:reason] = "best matching exercise"
@reason[:highest_difficulty_user_has_accessed] = highest_difficulty_user_has_accessed
@reason[:current_users_knowledge_lack] = current_users_knowledge_lack
@reason[:relative_knowledge_improvement] = relative_knowledge_improvement
Rails.logger.info("current users knowledge loss: " + current_users_knowledge_lack.map{|k,v| "#{k} => #{v}"}.to_s) Rails.logger.info("current users knowledge loss: " + current_users_knowledge_lack.map{|k,v| "#{k} => #{v}"}.to_s)
Rails.logger.info("relative improvements #{relative_knowledge_improvement.map{|k,v| k.id.to_s + ':' + v.to_s}}") Rails.logger.info("relative improvements #{relative_knowledge_improvement.map{|k,v| k.id.to_s + ':' + v.to_s}}")
best_matching_exercise best_matching_exercise

View File

@ -5,6 +5,7 @@ class CreateInterventions < ActiveRecord::Migration
t.belongs_to :exercise t.belongs_to :exercise
t.belongs_to :intervention t.belongs_to :intervention
t.integer :accumulated_worktime_s t.integer :accumulated_worktime_s
t.text :reason
t.timestamps t.timestamps
end end