Commit 986291aeb2357b01a9e79d6ff02bfde27f898607

Authored by Dhruv Kapadia
1 parent 6aa016fd

Refactored vote model to get better statistics

app/models/choice.rb
@@ -9,7 +9,7 @@ class Choice < ActiveRecord::Base @@ -9,7 +9,7 @@ class Choice < ActiveRecord::Base
9 validates_presence_of :question, :on => :create, :message => "can't be blank" 9 validates_presence_of :question, :on => :create, :message => "can't be blank"
10 #validates_length_of :item, :maximum => 140 10 #validates_length_of :item, :maximum => 140
11 11
12 - has_many :votes, :as => :voteable 12 + has_many :votes
13 has_many :prompts_on_the_left, :class_name => "Prompt", :foreign_key => "left_choice_id" 13 has_many :prompts_on_the_left, :class_name => "Prompt", :foreign_key => "left_choice_id"
14 has_many :prompts_on_the_right, :class_name => "Prompt", :foreign_key => "right_choice_id" 14 has_many :prompts_on_the_right, :class_name => "Prompt", :foreign_key => "right_choice_id"
15 named_scope :active, :conditions => { :active => true } 15 named_scope :active, :conditions => { :active => true }
app/models/prompt.rb
@@ -2,7 +2,7 @@ class Prompt < ActiveRecord::Base @@ -2,7 +2,7 @@ class Prompt < ActiveRecord::Base
2 #has_many :choices, :order => 'position DESC' 2 #has_many :choices, :order => 'position DESC'
3 3
4 has_many :skips 4 has_many :skips
5 - has_many :votes, :as => :voteable 5 + has_many :votes
6 6
7 7
8 belongs_to :question, :counter_cache => true 8 belongs_to :question, :counter_cache => true
app/models/question.rb
@@ -16,7 +16,7 @@ class Question < ActiveRecord::Base @@ -16,7 +16,7 @@ class Question < ActiveRecord::Base
16 end 16 end
17 end 17 end
18 end 18 end
19 - has_many :votes, :as => :voteable 19 + has_many :votes
20 20
21 after_save :ensure_at_least_two_choices 21 after_save :ensure_at_least_two_choices
22 attr_accessor :ideas 22 attr_accessor :ideas
app/models/visitor.rb
@@ -15,26 +15,30 @@ class Visitor < ActiveRecord::Base @@ -15,26 +15,30 @@ class Visitor < ActiveRecord::Base
15 15
16 def vote_for!(prompt, ordinality) 16 def vote_for!(prompt, ordinality)
17 # Why are there three vote objects created for every actual 'vote'? Why not have each vote have a questionid, promptid and choiceid? 17 # Why are there three vote objects created for every actual 'vote'? Why not have each vote have a questionid, promptid and choiceid?
18 - question_vote = votes.create!(:voteable_id => prompt.question_id, :voteable_type => "Question")  
19 - logger.info "Visitor: #{self.inspect} voted for Question: #{prompt.question_id}" 18 +# question_vote = votes.create!(:voteable_id => prompt.question_id, :voteable_type => "Question")
  19 +# logger.info "Visitor: #{self.inspect} voted for Question: #{prompt.question_id}"
20 20
21 21
22 - choices = prompt.choices  
23 - choice = choices[ordinality] #we need to guarantee that the choices are in the right order (by position)  
24 - prompt_vote = votes.create!(:voteable => prompt)  
25 - logger.info "Visitor: voted for Prompt: #{prompt.id.to_s}" 22 +# prompt_vote = votes.create!(:voteable => prompt)
  23 +# logger.info "Visitor: voted for Prompt: #{prompt.id.to_s}"
26 # @click = Click.new(:what_was_clicked => "on the API level, inside visitor#vote_for! with prompt id #{prompt.id}, ordinality #{ordinality.to_s}, choice: #{choice.item.data} (id: #{choice.id})") 24 # @click = Click.new(:what_was_clicked => "on the API level, inside visitor#vote_for! with prompt id #{prompt.id}, ordinality #{ordinality.to_s}, choice: #{choice.item.data} (id: #{choice.id})")
27 # @click.save! 25 # @click.save!
28 26
29 - choice_vote = votes.create!(:voteable => choice) 27 + choices = prompt.choices
  28 + choice = choices[ordinality] #we need to guarantee that the choices are in the right order (by position)
  29 + other_choices = choices - [choice]
  30 + other_choices.each {|c| c.lose! }
  31 +
  32 + loser_choice = other_choices.first
  33 + votes.create!(:question_id => prompt.question_id, :prompt_id => prompt_id, :voter_id=> self.id, :choice_id => choice.id, :loser_id => loser_choice.id)
  34 +
  35 +# choice_vote = votes.create!(:voteable => choice)
30 # logger.info "Visitor: voted for Prompt: #{prompt.id.to_s} for choice #{choice.item.data}" 36 # logger.info "Visitor: voted for Prompt: #{prompt.id.to_s} for choice #{choice.item.data}"
31 # choice.save! 37 # choice.save!
32 # choice.score = choice.compute_score 38 # choice.score = choice.compute_score
33 # logger.info "Just computed the score for that choice and it's apparently #{choice.score}" 39 # logger.info "Just computed the score for that choice and it's apparently #{choice.score}"
34 # choice.save! 40 # choice.save!
35 #logger.info "Saved. That choice's score is still #{choice.score}" 41 #logger.info "Saved. That choice's score is still #{choice.score}"
36 - other_choices = choices - [choice]  
37 - other_choices.each {|c| c.lose! }  
38 end 42 end
39 43
40 def skip!(prompt) 44 def skip!(prompt)
app/models/vote.rb
1 class Vote < ActiveRecord::Base 1 class Vote < ActiveRecord::Base
2 - belongs_to :voteable, :polymorphic => true, :counter_cache => true 2 +# belongs_to :voteable, :polymorphic => true, :counter_cache => true
3 belongs_to :voter, :class_name => "Visitor", :foreign_key => "voter_id" 3 belongs_to :voter, :class_name => "Visitor", :foreign_key => "voter_id"
  4 + belongs_to :question, :counter_cache => true
  5 + belongs_to :prompt, :counter_cache => true
  6 + belongs_to :choice, :counter_cache => true
4 end 7 end
db/migrate/20100215170553_rename_votes_table.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +class RenameVotesTable < ActiveRecord::Migration
  2 + def self.up
  3 + rename_table :votes, :oldvotes
  4 + end
  5 +
  6 + def self.down
  7 + rename_table :oldvotes, :votes
  8 + end
  9 +end
db/migrate/20100215170926_create_refactored_vote_model.rb 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +class CreateRefactoredVoteModel < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :votes do |table|
  4 + table.text :tracking
  5 + table.integer :site_id
  6 + table.integer :voter_id
  7 + table.integer :question_id
  8 + table.integer :prompt_id
  9 + table.integer :choice_id
  10 + table.integer :loser_choice_id
  11 + table.timestamps
  12 + end
  13 + end
  14 +
  15 + def self.down
  16 + drop_table :votes
  17 + end
  18 +end