Commit 21c22686bb8a19c1dbef893df008bd29362679bf

Authored by Luke Baker
1 parent 580db1c8

update catchup algorithm

When calculating weights, ignore prompts with invalid choices.  Update
if statement that determines if all possible valid prompts have been
created. Update test factory to include case where there exists a prompt
with invalid choices.
Showing 2 changed files with 11 additions and 2 deletions   Show diff stats
app/models/question.rb
@@ -114,7 +114,11 @@ class Question < ActiveRecord::Base @@ -114,7 +114,11 @@ class Question < ActiveRecord::Base
114 throttle_min = 0.05 114 throttle_min = 0.05
115 sum = 0.0 115 sum = 0.0
116 116
117 - prompts.find_each(:select => 'votes_count, left_choice_id, right_choice_id') do |p| 117 + # get weights of all existing prompts that have two active choices
  118 + active_choice_ids = choices.active.map {|c| c.id}
  119 + prompts.find_each(:select => 'votes_count, left_choice_id, right_choice_id',
  120 + :conditions => {:left_choice_id => active_choice_ids,
  121 + :right_choice_id => active_choice_ids}) do |p|
118 value = [(1.0/ (p.votes.size + 1).to_f).to_f, throttle_min].min 122 value = [(1.0/ (p.votes.size + 1).to_f).to_f, throttle_min].min
119 weights["#{p.left_choice_id}, #{p.right_choice_id}"] = value 123 weights["#{p.left_choice_id}, #{p.right_choice_id}"] = value
120 sum += value 124 sum += value
@@ -122,7 +126,7 @@ class Question < ActiveRecord::Base @@ -122,7 +126,7 @@ class Question < ActiveRecord::Base
122 126
123 # This will not run once all prompts have been generated, 127 # This will not run once all prompts have been generated,
124 # but it prevents us from having to pregenerate all possible prompts 128 # but it prevents us from having to pregenerate all possible prompts
125 - if weights.size < choices.size ** 2 - choices.size 129 + if weights.size < choices.active.size ** 2 - choices.active.size
126 choices.active.each do |l| 130 choices.active.each do |l|
127 choices.active.each do |r| 131 choices.active.each do |r|
128 if l.id == r.id 132 if l.id == r.id
spec/factories.rb
@@ -36,6 +36,11 @@ Factory.define(:aoi_question, :parent =&gt; :question) do |f| @@ -36,6 +36,11 @@ Factory.define(:aoi_question, :parent =&gt; :question) do |f|
36 :left_choice => question.choices.first, 36 :left_choice => question.choices.first,
37 :right_choice => question.choices.second) 37 :right_choice => question.choices.second)
38 38
  39 + result << Factory.build(:prompt,
  40 + :question => question.result,
  41 + :left_choice => question.choices.third,
  42 + :right_choice => question.choices.fourth)
  43 +
39 end 44 end
40 result 45 result
41 end 46 end