diff --git a/app/models/question.rb b/app/models/question.rb index 046bed9..9a97d9b 100644 --- a/app/models/question.rb +++ b/app/models/question.rb @@ -140,34 +140,32 @@ class Question < ActiveRecord::Base current_user = self.site if params[:with_prompt] - @prompt = choose_prompt(:algorithm => params[:algorithm]) - result.merge!({:picked_prompt_id => @prompt.id}) - - if params[:with_appearance] && visitor_identifier.present? + + if params[:with_appearance] && visitor_identifier.present? visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier) last_appearance = visitor.appearances.find(:first, :conditions => {:question_id => self.id}, :order => 'created_at DESC', :limit => 1) - if last_appearance.nil?|| last_appearance.answered? + if last_appearance.nil?|| last_appearance.answered? || !last_appearance.prompt.active? + @prompt = choose_prompt(:algorithm => params[:algorithm]) @appearance = current_user.record_appearance(visitor, @prompt) else #only display a new prompt and new appearance if the old prompt has not been voted on @appearance = last_appearance - possible_prompt = @appearance.prompt - - #edge case, it's possible that the previous prompt has become deactivated in the elapsed time - if possible_prompt.active? - result.merge!({:picked_prompt_id => possible_prompt.id}) - else - @appearance = current_user.record_appearance(visitor, @prompt) - end - end + @prompt= @appearance.prompt + end + result.merge!({:appearance_id => @appearance.lookup}) else # throw some error + end + + if !@prompt + @prompt = choose_prompt(:algorithm => params[:algorithm]) end - end + result.merge!({:picked_prompt_id => @prompt.id}) + end if params[:with_visitor_stats] visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier) @@ -435,6 +433,11 @@ class Question < ActiveRecord::Base $redis.get(self.pq_key + "_" + date.to_s + "_"+ "hits") end + def reset_cache_tracking_keys(date) + $redis.del(self.pq_key + "_" + date.to_s + "_"+ "misses") + $redis.del(self.pq_key + "_" + date.to_s + "_"+ "hits") + end + def expire_prompt_cache_tracking_keys(date, expire_time = 24*60*60 * 3) # default expires in three days $redis.expire(self.pq_key + "_" + date.to_s + "_"+ "hits", expire_time) diff --git a/spec/models/question_spec.rb b/spec/models/question_spec.rb index b08c43b..63c8d72 100644 --- a/spec/models/question_spec.rb +++ b/spec/models/question_spec.rb @@ -112,6 +112,16 @@ describe Question do @question_optional_information[:picked_prompt_id].should == saved_prompt_id end + it "should properly handle tracking the prompt cache hit rate when returning the same appearance when a visitor requests two prompts without voting" do + params = {:id => 124, :with_visitor_stats=> true, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true} + @question.clear_prompt_queue + @question.reset_cache_tracking_keys(Date.today) + @question.get_optional_information(params) + @question.get_prompt_cache_misses(Date.today).should == "1" + @question.get_optional_information(params) + @question.get_prompt_cache_misses(Date.today).should == "1" + end + it "should auto create ideas when 'ideas' attribute is set" do @question = Factory.build(:question) @question.ideas = %w(one two three) -- libgit2 0.21.2