Commit 30299524ce73749a0bfcd05171f3a485791e5a94
1 parent
08c534ca
Exists in
master
and in
1 other branch
Adding parameter to find average votes of people who have voted
Showing
2 changed files
with
30 additions
and
0 deletions
Show diff stats
app/models/question.rb
@@ -204,6 +204,20 @@ class Question < ActiveRecord::Base | @@ -204,6 +204,20 @@ class Question < ActiveRecord::Base | ||
204 | result.merge!(:visitor_votes => visitor.votes.count(:conditions => {:question_id => self.id})) | 204 | result.merge!(:visitor_votes => visitor.votes.count(:conditions => {:question_id => self.id})) |
205 | result.merge!(:visitor_ideas => visitor.choices.count) | 205 | result.merge!(:visitor_ideas => visitor.choices.count) |
206 | end | 206 | end |
207 | + | ||
208 | + # this might get cpu intensive if used too often. If so, store the calculated value in redis | ||
209 | + # and expire after X minutes | ||
210 | + if params[:with_average_votes] | ||
211 | + votes_by_visitors = self.votes.count(:group => 'voter_id') | ||
212 | + | ||
213 | + if votes_by_visitors.size > 0 | ||
214 | + average = votes_by_visitors.inject(0){|total, (k,v)| total = total + v}.to_f / votes_by_visitors.size.to_f | ||
215 | + else | ||
216 | + average = 0.0 | ||
217 | + end | ||
218 | + | ||
219 | + result.merge!(:average_votes => (average*100).round / 100.0) # round to 2 decimals | ||
220 | + end | ||
207 | 221 | ||
208 | return result | 222 | return result |
209 | 223 |
spec/models/question_spec.rb
@@ -170,6 +170,22 @@ describe Question do | @@ -170,6 +170,22 @@ describe Question do | ||
170 | @question_optional_information[:future_appearance_id_1].should_not == future_appearance_id_1 | 170 | @question_optional_information[:future_appearance_id_1].should_not == future_appearance_id_1 |
171 | end | 171 | end |
172 | 172 | ||
173 | + it "should provide average voter information" do | ||
174 | + params = {:id => 124, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true, :with_average_votes => true } | ||
175 | + @question_optional_information = @question.get_optional_information(params) | ||
176 | + @question_optional_information[:average_votes].should be_an_instance_of(Float) | ||
177 | + @question_optional_information[:average_votes].should be_close(0.0, 0.1) | ||
178 | + | ||
179 | + vote_options = {:visitor_identifier => "jim", | ||
180 | + :appearance_lookup => @question_optional_information[:appearance_id], | ||
181 | + :prompt => Prompt.find(@question_optional_information[:picked_prompt_id]), | ||
182 | + :direction => "left"} | ||
183 | + | ||
184 | + @aoi_clone.record_vote(vote_options) | ||
185 | + @question_optional_information = @question.get_optional_information(params) | ||
186 | + @question_optional_information[:average_votes].should be_close(1.0, 0.1) | ||
187 | + end | ||
188 | + | ||
173 | it "should properly handle tracking the prompt cache hit rate when returning the same appearance when a visitor requests two prompts without voting" do | 189 | it "should properly handle tracking the prompt cache hit rate when returning the same appearance when a visitor requests two prompts without voting" do |
174 | params = {:id => 124, :with_visitor_stats=> true, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true} | 190 | params = {:id => 124, :with_visitor_stats=> true, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true} |
175 | @question.clear_prompt_queue | 191 | @question.clear_prompt_queue |