diff --git a/app/models/question.rb b/app/models/question.rb index 00fce0d..26df051 100644 --- a/app/models/question.rb +++ b/app/models/question.rb @@ -204,6 +204,20 @@ class Question < ActiveRecord::Base result.merge!(:visitor_votes => visitor.votes.count(:conditions => {:question_id => self.id})) result.merge!(:visitor_ideas => visitor.choices.count) end + + # this might get cpu intensive if used too often. If so, store the calculated value in redis + # and expire after X minutes + if params[:with_average_votes] + votes_by_visitors = self.votes.count(:group => 'voter_id') + + if votes_by_visitors.size > 0 + average = votes_by_visitors.inject(0){|total, (k,v)| total = total + v}.to_f / votes_by_visitors.size.to_f + else + average = 0.0 + end + + result.merge!(:average_votes => (average*100).round / 100.0) # round to 2 decimals + end return result diff --git a/spec/models/question_spec.rb b/spec/models/question_spec.rb index 1525ad3..626b828 100644 --- a/spec/models/question_spec.rb +++ b/spec/models/question_spec.rb @@ -170,6 +170,22 @@ describe Question do @question_optional_information[:future_appearance_id_1].should_not == future_appearance_id_1 end + it "should provide average voter information" do + params = {:id => 124, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true, :with_average_votes => true } + @question_optional_information = @question.get_optional_information(params) + @question_optional_information[:average_votes].should be_an_instance_of(Float) + @question_optional_information[:average_votes].should be_close(0.0, 0.1) + + vote_options = {:visitor_identifier => "jim", + :appearance_lookup => @question_optional_information[:appearance_id], + :prompt => Prompt.find(@question_optional_information[:picked_prompt_id]), + :direction => "left"} + + @aoi_clone.record_vote(vote_options) + @question_optional_information = @question.get_optional_information(params) + @question_optional_information[:average_votes].should be_close(1.0, 0.1) + 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 -- libgit2 0.21.2