From fe8ccbdf58f19af1bbf9c53f341387fd67229b94 Mon Sep 17 00:00:00 2001 From: Dhruv Kapadia Date: Tue, 3 Aug 2010 17:18:43 -0400 Subject: [PATCH] When we invalidate votes, we also need to update the score --- app/models/vote.rb | 9 +++++++-- spec/models/vote_spec.rb | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/models/vote.rb b/app/models/vote.rb index 651e773..1cf7f87 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -23,7 +23,7 @@ class Vote < ActiveRecord::Base serialize :tracking after_create :update_winner_choice, :update_loser_choice - after_save :update_counter_caches_based_on_flags + after_save :update_cached_values_based_on_flags def update_winner_choice choice.reload # make sure we're using updated counter values @@ -37,7 +37,7 @@ class Vote < ActiveRecord::Base # this is necessary to handle counter cache, at least until the following patch is accepted: # https://rails.lighthouseapp.com/projects/8994/tickets/3521-patch-add-conditional-counter-cache - def update_counter_caches_based_on_flags + def update_cached_values_based_on_flags if valid_record_changed? if valid_record Question.increment_counter(:votes_count, self.question_id) @@ -50,6 +50,11 @@ class Vote < ActiveRecord::Base Choice.decrement_counter(:wins, self.choice_id) Choice.decrement_counter(:losses, self.loser_choice_id) end + + choice.reload + choice.compute_score! + loser_choice.reload + loser_choice.compute_score! end end end diff --git a/spec/models/vote_spec.rb b/spec/models/vote_spec.rb index f5e93f5..021b29a 100644 --- a/spec/models/vote_spec.rb +++ b/spec/models/vote_spec.rb @@ -183,5 +183,24 @@ describe Vote do @prompt.right_choice.losses.should == 0 end + + it "should update score choice and loser_choice after invalid is changed" do + vote = Factory.create(:vote, :question => @question, :prompt => @prompt, + :choice => @prompt.left_choice, + :loser_choice => @prompt.right_choice) + + @prompt.left_choice.reload + @prompt.left_choice.score.should be_close(67, 1) + @prompt.right_choice.reload + @prompt.right_choice.score.should be_close(33, 1) + + vote.valid_record = false + vote.save + + @prompt.left_choice.reload + @prompt.left_choice.score.should == 50 + @prompt.right_choice.reload + @prompt.right_choice.score.should == 50 + end end -- libgit2 0.21.2