Commit d90fe8cd2196985384b873e656404a0bef56d929

Authored by Luke Baker
1 parent 4c7f9366

make updates to simple random choose prompt

rename picked_prompt to simple_random_choose_prompt
add tests for distinct_array_of_choice_ids
modify distinct_array_of_choice_ids to use named parameters
move conditions variable creation outside of loop
update conditions creation to handle when only_active is false
app/models/question.rb
... ... @@ -57,7 +57,7 @@ class Question < ActiveRecord::Base
57 57 next_prompt = self.pop_prompt_queue
58 58 if next_prompt.nil?
59 59 logger.info("DEBUG Catchup prompt cache miss! Nothing in prompt_queue")
60   - next_prompt = self.picked_prompt
  60 + next_prompt = self.simple_random_choose_prompt
61 61 record_prompt_cache_miss
62 62 else
63 63 record_prompt_cache_hit
... ... @@ -66,16 +66,16 @@ class Question < ActiveRecord::Base
66 66 return next_prompt
67 67 else
68 68 #Standard choose prompt at random
69   - return self.picked_prompt
  69 + return self.simple_random_choose_prompt
70 70 end
71 71  
72 72 end
73 73  
74 74 #TODO: generalize for prompts of rank > 2
75   - def picked_prompt(rank = 2)
76   - logger.info "inside Question#picked_prompt"
  75 + def simple_random_choose_prompt(rank = 2)
  76 + logger.info "inside Question#simple_random_choose_prompt"
77 77 raise NotImplementedError.new("Sorry, we currently only support pairwise prompts. Rank of the prompt must be 2.") unless rank == 2
78   - choice_id_array = distinct_array_of_choice_ids(rank, true)
  78 + choice_id_array = distinct_array_of_choice_ids(:rank => rank, :only_active => true)
79 79 prompts.find_or_create_by_left_choice_id_and_right_choice_id(choice_id_array[0], choice_id_array[1], :include => [:left_choice ,:right_choice ])
80 80 end
81 81  
... ... @@ -334,13 +334,20 @@ class Question < ActiveRecord::Base
334 334 end
335 335  
336 336  
337   - def distinct_array_of_choice_ids(rank = 2, only_active = true)
  337 + def distinct_array_of_choice_ids(params={})
  338 + params = {
  339 + :rank => 2,
  340 + :only_active => true
  341 + }.merge(params)
  342 + rank = params[:rank]
  343 + only_active = params[:only_active]
338 344 count = (only_active) ? choices.active.count : choices.count
339 345  
340 346 found_choices = []
  347 + # select only active choices?
  348 + conditions = (only_active) ? ['active = ?', true] : ['1=1']
  349 +
341 350 rank.times do
342   - # select only active choices?
343   - conditions = (only_active) ? ['active = ?', true] : ['']
344 351 # if we've already found some, make sure we don't find them again
345 352 if found_choices.count > 0
346 353 conditions[0] += ' AND id NOT IN (?)'
... ... @@ -350,13 +357,14 @@ class Question < ActiveRecord::Base
350 357 found_choices.push choices.find(:first,
351 358 :select => 'id',
352 359 :conditions => conditions,
  360 + # rand generates value >= 0 and < param
353 361 :offset => rand(count - found_choices.count)).id
354 362 end
355 363 return found_choices
356 364 end
357 365  
358 366 def picked_prompt_id
359   - picked_prompt.id
  367 + simple_random_choose_prompt.id
360 368 end
361 369  
362 370 def self.voted_on_by(u)
... ...
spec/models/question_spec.rb
... ... @@ -37,10 +37,23 @@ describe Question do
37 37 #end
38 38  
39 39 it "should choose an active prompt randomly" do
40   - prompt = @question.picked_prompt
  40 + prompt = @question.simple_random_choose_prompt
41 41 prompt.active?.should == true
42 42 end
43 43  
  44 + it "should randomly choose two active choices" do
  45 + 50.times do
  46 + choice_ids = @question.distinct_array_of_choice_ids(:rank => 2, :only_active => true)
  47 + choice_ids.count.should == 2
  48 + choice_ids.uniq.count.should == 2
  49 + choice_ids.each do |choice_id|
  50 + c = Choice.find(choice_id)
  51 + c.active?.should == true
  52 + end
  53 + end
  54 +
  55 + end
  56 +
44 57 it "should choose an active prompt using catchup algorithm" do
45 58 prompt = @question.catchup_choose_prompt
46 59 prompt.active?.should == true
... ... @@ -321,7 +334,8 @@ describe Question do
321 334 end
322 335  
323 336 200.times.each do |num|
324   - @p = @aoi_question.picked_prompt
  337 + @p = @aoi_question.simple_random_choose_prompt
  338 + @p.active?.should == true
325 339  
326 340 @a = user.record_appearance(visitor, @p)
327 341  
... ... @@ -454,7 +468,8 @@ describe Question do
454 468 {:data => "foo'bar", :local_identifier => "example creator"})
455 469  
456 470 40.times.each do |num|
457   - @p = @aoi_question.picked_prompt
  471 + @p = @aoi_question.simple_random_choose_prompt
  472 + @p.active?.should == true
458 473  
459 474 @a = user.record_appearance(visitor, @p)
460 475  
... ...