Commit ee975a4eb434c06b8fe208acd097e91a3fdde8c5
1 parent
1d4ab5ab
Exists in
master
and in
1 other branch
Refactoring part of question_optional_information to support back button
Showing
2 changed files
with
28 additions
and
15 deletions
Show diff stats
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) | ... | ... |