Commit ee975a4eb434c06b8fe208acd097e91a3fdde8c5

Authored by Dhruv Kapadia
1 parent 1d4ab5ab

Refactoring part of question_optional_information to support back button

app/models/question.rb
... ... @@ -140,34 +140,32 @@ class Question < ActiveRecord::Base
140 140 current_user = self.site
141 141  
142 142 if params[:with_prompt]
143   - @prompt = choose_prompt(:algorithm => params[:algorithm])
144   - result.merge!({:picked_prompt_id => @prompt.id})
145   -
146   - if params[:with_appearance] && visitor_identifier.present?
  143 +
  144 + if params[:with_appearance] && visitor_identifier.present?
147 145 visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier)
148 146  
149 147 last_appearance = visitor.appearances.find(:first, :conditions => {:question_id => self.id},
150 148 :order => 'created_at DESC',
151 149 :limit => 1)
152   - if last_appearance.nil?|| last_appearance.answered?
  150 + if last_appearance.nil?|| last_appearance.answered? || !last_appearance.prompt.active?
  151 + @prompt = choose_prompt(:algorithm => params[:algorithm])
153 152 @appearance = current_user.record_appearance(visitor, @prompt)
154 153 else
155 154 #only display a new prompt and new appearance if the old prompt has not been voted on
156 155 @appearance = last_appearance
157   - possible_prompt = @appearance.prompt
158   -
159   - #edge case, it's possible that the previous prompt has become deactivated in the elapsed time
160   - if possible_prompt.active?
161   - result.merge!({:picked_prompt_id => possible_prompt.id})
162   - else
163   - @appearance = current_user.record_appearance(visitor, @prompt)
164   - end
165   - end
  156 + @prompt= @appearance.prompt
  157 + end
  158 +
166 159 result.merge!({:appearance_id => @appearance.lookup})
167 160 else
168 161 # throw some error
  162 + end
  163 +
  164 + if !@prompt
  165 + @prompt = choose_prompt(:algorithm => params[:algorithm])
169 166 end
170   - end
  167 + result.merge!({:picked_prompt_id => @prompt.id})
  168 + end
171 169  
172 170 if params[:with_visitor_stats]
173 171 visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier)
... ... @@ -435,6 +433,11 @@ class Question < ActiveRecord::Base
435 433 $redis.get(self.pq_key + "_" + date.to_s + "_"+ "hits")
436 434 end
437 435  
  436 + def reset_cache_tracking_keys(date)
  437 + $redis.del(self.pq_key + "_" + date.to_s + "_"+ "misses")
  438 + $redis.del(self.pq_key + "_" + date.to_s + "_"+ "hits")
  439 + end
  440 +
438 441  
439 442 def expire_prompt_cache_tracking_keys(date, expire_time = 24*60*60 * 3) # default expires in three days
440 443 $redis.expire(self.pq_key + "_" + date.to_s + "_"+ "hits", expire_time)
... ...
spec/models/question_spec.rb
... ... @@ -112,6 +112,16 @@ describe Question do
112 112 @question_optional_information[:picked_prompt_id].should == saved_prompt_id
113 113 end
114 114  
  115 + it "should properly handle tracking the prompt cache hit rate when returning the same appearance when a visitor requests two prompts without voting" do
  116 + params = {:id => 124, :with_visitor_stats=> true, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true}
  117 + @question.clear_prompt_queue
  118 + @question.reset_cache_tracking_keys(Date.today)
  119 + @question.get_optional_information(params)
  120 + @question.get_prompt_cache_misses(Date.today).should == "1"
  121 + @question.get_optional_information(params)
  122 + @question.get_prompt_cache_misses(Date.today).should == "1"
  123 + end
  124 +
115 125 it "should auto create ideas when 'ideas' attribute is set" do
116 126 @question = Factory.build(:question)
117 127 @question.ideas = %w(one two three)
... ...