Commit fe8ccbdf58f19af1bbf9c53f341387fd67229b94

Authored by Dhruv Kapadia
1 parent b18e4649

When we invalidate votes, we also need to update the score

Showing 2 changed files with 26 additions and 2 deletions   Show diff stats
app/models/vote.rb
... ... @@ -23,7 +23,7 @@ class Vote < ActiveRecord::Base
23 23 serialize :tracking
24 24  
25 25 after_create :update_winner_choice, :update_loser_choice
26   - after_save :update_counter_caches_based_on_flags
  26 + after_save :update_cached_values_based_on_flags
27 27  
28 28 def update_winner_choice
29 29 choice.reload # make sure we're using updated counter values
... ... @@ -37,7 +37,7 @@ class Vote < ActiveRecord::Base
37 37  
38 38 # this is necessary to handle counter cache, at least until the following patch is accepted:
39 39 # https://rails.lighthouseapp.com/projects/8994/tickets/3521-patch-add-conditional-counter-cache
40   - def update_counter_caches_based_on_flags
  40 + def update_cached_values_based_on_flags
41 41 if valid_record_changed?
42 42 if valid_record
43 43 Question.increment_counter(:votes_count, self.question_id)
... ... @@ -50,6 +50,11 @@ class Vote < ActiveRecord::Base
50 50 Choice.decrement_counter(:wins, self.choice_id)
51 51 Choice.decrement_counter(:losses, self.loser_choice_id)
52 52 end
  53 +
  54 + choice.reload
  55 + choice.compute_score!
  56 + loser_choice.reload
  57 + loser_choice.compute_score!
53 58 end
54 59 end
55 60 end
... ...
spec/models/vote_spec.rb
... ... @@ -183,5 +183,24 @@ describe Vote do
183 183 @prompt.right_choice.losses.should == 0
184 184  
185 185 end
  186 +
  187 + it "should update score choice and loser_choice after invalid is changed" do
  188 + vote = Factory.create(:vote, :question => @question, :prompt => @prompt,
  189 + :choice => @prompt.left_choice,
  190 + :loser_choice => @prompt.right_choice)
  191 +
  192 + @prompt.left_choice.reload
  193 + @prompt.left_choice.score.should be_close(67, 1)
  194 + @prompt.right_choice.reload
  195 + @prompt.right_choice.score.should be_close(33, 1)
  196 +
  197 + vote.valid_record = false
  198 + vote.save
  199 +
  200 + @prompt.left_choice.reload
  201 + @prompt.left_choice.score.should == 50
  202 + @prompt.right_choice.reload
  203 + @prompt.right_choice.score.should == 50
  204 + end
186 205  
187 206 end
... ...