Commit d1736d29144dee413f9c64c92f1bd6ce562b8d31

Authored by Dmitri Garbuzov
1 parent 5e0f9114

replaced choice#votes_count/loss_count with wins/losses

app/controllers/choices_controller.rb
... ... @@ -34,15 +34,6 @@ class ChoicesController < InheritedResources::Base
34 34  
35 35 end
36 36  
37   - def show
38   - show! do |format|
39   - format.xml {
40   - @choice.reload
41   - render :xml => @choice.to_xml(:methods => [:wins_plus_losses])}
42   - format.json { render :json => @choice.to_json(:methods => [:data])}
43   - end
44   - end
45   -
46 37 def votes
47 38 @choice = Choice.find(params[:id])
48 39 render :xml => @choice.votes.to_xml
... ...
app/models/choice.rb
... ... @@ -16,39 +16,11 @@ class Choice < ActiveRecord::Base
16 16  
17 17 after_save :update_questions_counter
18 18  
19   - attr_protected :prompts_count, :votes_count, :loss_count, :wins, :losses, :score,
20   - :prompts_on_the_right_count, :prompts_on_the_left_count
  19 + attr_protected :prompts_count, :wins, :losses, :score, :prompts_on_the_right_count, :prompts_on_the_left_count
21 20  
22 21 def update_questions_counter
23 22 self.question.update_attribute(:inactive_choices_count, self.question.choices.inactive.length)
24 23 end
25   - #attr_accessor :data
26   -
27   - def lose!
28   - Choice.increment_counter(:loss_count, self.id)
29   - self.loss_count +=1 # reflect the update just done above, so score is correct
30   - self.score = compute_score
31   - self.save
32   - end
33   -
34   - def win!
35   - self.votes_count += 1 rescue (self.votes_count = 1)
36   - self.score = compute_score
37   - self.save!
38   - end
39   -
40   - def wins_plus_losses
41   - wins + losses
42   - end
43   -
44   - # TODO delete these and refactor loss_count and votes_count into losses and wins
45   - def losses
46   - loss_count || 0
47   - end
48   -
49   - def wins
50   - votes_count || 0
51   - end
52 24  
53 25 def before_create
54 26 unless self.score
... ...
app/models/vote.rb
... ... @@ -9,8 +9,8 @@ class Vote < ActiveRecord::Base
9 9 belongs_to :voter, :class_name => "Visitor", :foreign_key => "voter_id"
10 10 belongs_to :question, :counter_cache => true
11 11 belongs_to :prompt, :counter_cache => true
12   - belongs_to :choice, :counter_cache => true
13   - belongs_to :loser_choice, :class_name => "Choice", :foreign_key => "loser_choice_id"
  12 + belongs_to :choice, :counter_cache => true, :counter_cache => :wins
  13 + belongs_to :loser_choice, :class_name => "Choice", :foreign_key => "loser_choice_id", :counter_cache => :losses
14 14 has_one :appearance, :as => :answerable
15 15  
16 16 named_scope :recent, lambda { |*args| {:conditions => ["created_at > ?", (args.first || Date.today.beginning_of_day)]} }
... ... @@ -25,10 +25,12 @@ class Vote < ActiveRecord::Base
25 25 after_create :update_winner_choice, :update_loser_choice
26 26  
27 27 def update_winner_choice
28   - choice.win!
  28 + choice.reload # make sure we're using updated counter values
  29 + choice.compute_score!
29 30 end
30 31  
31 32 def update_loser_choice
32   - loser_choice.lose!
  33 + loser_choice.reload
  34 + loser_choice.compute_score!
33 35 end
34 36 end
... ...
db/migrate/20100727203816_remove_wins_losses_and_rename_counts.rb 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +class RemoveWinsLossesAndRenameCounts < ActiveRecord::Migration
  2 + def self.up
  3 + remove_column :choices, :wins
  4 + remove_column :choices, :losses
  5 + rename_column :choices, :votes_count, :wins
  6 + rename_column :choices, :loss_count, :losses
  7 + end
  8 +
  9 + def self.down
  10 + rename_column :choices, :wins, :votes_count
  11 + rename_column :choices, :losses, :loss_count
  12 + add_column :choices, :wins, :integer
  13 + add_column :choices, :losses, :integer
  14 + end
  15 +end
... ...
db/schema.rb
... ... @@ -9,7 +9,7 @@
9 9 #
10 10 # It's strongly recommended to check this file into your version control system.
11 11  
12   -ActiveRecord::Schema.define(:version => 20100722052215) do
  12 +ActiveRecord::Schema.define(:version => 20100727203816) do
13 13  
14 14 create_table "appearances", :force => true do |t|
15 15 t.integer "voter_id"
... ... @@ -32,9 +32,7 @@ ActiveRecord::Schema.define(:version =&gt; 20100722052215) do
32 32 t.integer "item_id"
33 33 t.integer "question_id"
34 34 t.integer "position"
35   - t.integer "wins"
36 35 t.integer "ratings"
37   - t.integer "losses"
38 36 t.datetime "created_at"
39 37 t.datetime "updated_at"
40 38 t.integer "request_id"
... ... @@ -45,8 +43,8 @@ ActiveRecord::Schema.define(:version =&gt; 20100722052215) do
45 43 t.string "local_identifier"
46 44 t.integer "prompts_on_the_left_count", :default => 0
47 45 t.integer "prompts_on_the_right_count", :default => 0
48   - t.integer "votes_count", :default => 0
49   - t.integer "loss_count", :default => 0
  46 + t.integer "wins", :default => 0
  47 + t.integer "losses", :default => 0
50 48 t.integer "prompts_count", :default => 0
51 49 t.string "data"
52 50 t.integer "creator_id"
... ...
spec/models/choice_spec.rb
... ... @@ -27,8 +27,6 @@ describe Choice do
27 27 @unreasonable_value = 9999
28 28 @protected_attributes = {}
29 29 [ :prompts_count,
30   - :votes_count,
31   - :loss_count,
32 30 :wins,
33 31 :losses,
34 32 :score,
... ... @@ -100,15 +98,15 @@ describe Choice do
100 98 end
101 99 it "correctly compute a score based on wins and losses" do
102 100 choice1 = Choice.create!(@valid_attributes)
103   - choice1.votes_count = 30
104   - choice1.loss_count = 70
  101 + choice1.wins = 30
  102 + choice1.losses = 70
105 103 choice1.compute_score.should be_close(30,1)
106 104 end
107 105 it "compute score and save" do
108 106 choice1 = Choice.create!(@valid_attributes)
109 107 choice1.score.should == 50
110   - choice1.votes_count= 30
111   - choice1.loss_count = 70
  108 + choice1.wins = 30
  109 + choice1.losses = 70
112 110 choice1.compute_score!
113 111 choice1.score.should be_close(30, 1)
114 112 end
... ... @@ -124,15 +122,19 @@ describe Choice do
124 122 end
125 123  
126 124 describe "voting updates things" do
127   - before do
128   - @prompt = @question.choose_prompt
129   - @winning_choice = @prompt.left_choice
130   - @losing_choice = @prompt.right_choice
131   - @winning_choice.win!
132   - @losing_choice.lose!
  125 + before do
  126 + @prompt = @question.choose_prompt
  127 + @winning_choice = @prompt.left_choice
  128 + @losing_choice = @prompt.right_choice
  129 + vote = Vote.create!(:choice_id => @winning_choice.id,
  130 + :loser_choice_id => @losing_choice.id,
  131 + :question_id => @question.id,
  132 + :voter_id => @visitor.id,
  133 + :prompt_id => @prompt.id )
133 134 end
134 135  
135 136 it "should update score on a win" do
  137 + @winning_choice.reload
136 138 @winning_choice.score.should be_close(67, 1)
137 139 end
138 140 it "should update score on a loss" do
... ... @@ -140,15 +142,13 @@ describe Choice do
140 142 @losing_choice.score.should be_close(33,1)
141 143 end
142 144 it "should update win count on a win" do
143   - @winning_choice.votes_count.should == 1
  145 + @winning_choice.reload
144 146 @winning_choice.wins.should == 1
145   - @winning_choice.loss_count.should == 0
146 147 @winning_choice.losses.should == 0
147 148 end
148 149 it "should update loss count on a loss" do
149   - @losing_choice.votes_count.should == 0
  150 + @losing_choice.reload
150 151 @losing_choice.wins.should == 0
151   - @losing_choice.loss_count.should == 1
152 152 @losing_choice.losses.should == 1
153 153 end
154 154 end
... ...
spec/models/question_spec.rb
... ... @@ -173,7 +173,7 @@ describe Question do
173 173 it "should provide average voter information" do
174 174 params = {:id => 124, :visitor_identifier => "jim", :with_prompt => true, :with_appearance => true, :with_average_votes => true }
175 175 @question_optional_information = @question.get_optional_information(params)
176   - @question_optional_information[:average_votes].should be_an_instance_of(Float)
  176 + @question_optional_information[:average_votes].should be_an_instance_of(Fixnum)
177 177 @question_optional_information[:average_votes].should be_close(0.0, 0.1)
178 178  
179 179 vote_options = {:visitor_identifier => "jim",
... ...
spec/models/vote_spec.rb
... ... @@ -38,18 +38,18 @@ describe Vote do
38 38 end
39 39 it "should update counter cache on choice" do
40 40 @prompt.left_choice.votes.size.should == 0
41   - @prompt.left_choice.votes_count.should == 0
  41 + @prompt.left_choice.wins.should == 0
42 42 Factory.create(:vote, :question => @question, :prompt => @prompt,
43 43 :choice => @prompt.left_choice)
44 44  
45 45 @prompt.left_choice.reload
46 46 @prompt.left_choice.votes.size.should == 1
47   - @prompt.left_choice.votes_count.should == 1
  47 + @prompt.left_choice.wins.should == 1
48 48 end
49 49 it "should update counter cache on loser_choice" do
50 50 @prompt.left_choice.votes.size.should == 0
51 51 @prompt.right_choice.losses.should == 0
52   - @prompt.left_choice.votes_count.should == 0
  52 + @prompt.left_choice.wins.should == 0
53 53 Factory.create(:vote, :question => @question, :prompt => @prompt,
54 54 :choice => @prompt.left_choice,
55 55 :loser_choice => @prompt.right_choice)
... ... @@ -57,8 +57,7 @@ describe Vote do
57 57  
58 58 @prompt.right_choice.reload
59 59 @prompt.right_choice.votes.size.should == 0
60   - @prompt.right_choice.votes_count.should == 0
61   - @prompt.right_choice.loss_count.should == 1
  60 + @prompt.right_choice.wins.should == 0
62 61 @prompt.right_choice.losses.should == 1
63 62 end
64 63  
... ...