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 9 validates_presence_of :question, :on => :create, :message => "can't be blank"
10 10 #validates_length_of :item, :maximum => 140
11 11  
12   - has_many :votes, :as => :voteable
  12 + has_many :votes
13 13 has_many :prompts_on_the_left, :class_name => "Prompt", :foreign_key => "left_choice_id"
14 14 has_many :prompts_on_the_right, :class_name => "Prompt", :foreign_key => "right_choice_id"
15 15 named_scope :active, :conditions => { :active => true }
... ...
app/models/prompt.rb
... ... @@ -2,7 +2,7 @@ class Prompt < ActiveRecord::Base
2 2 #has_many :choices, :order => 'position DESC'
3 3  
4 4 has_many :skips
5   - has_many :votes, :as => :voteable
  5 + has_many :votes
6 6  
7 7  
8 8 belongs_to :question, :counter_cache => true
... ...
app/models/question.rb
... ... @@ -16,7 +16,7 @@ class Question < ActiveRecord::Base
16 16 end
17 17 end
18 18 end
19   - has_many :votes, :as => :voteable
  19 + has_many :votes
20 20  
21 21 after_save :ensure_at_least_two_choices
22 22 attr_accessor :ideas
... ...
app/models/visitor.rb
... ... @@ -15,26 +15,30 @@ class Visitor < ActiveRecord::Base
15 15  
16 16 def vote_for!(prompt, ordinality)
17 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 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 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 36 # logger.info "Visitor: voted for Prompt: #{prompt.id.to_s} for choice #{choice.item.data}"
31 37 # choice.save!
32 38 # choice.score = choice.compute_score
33 39 # logger.info "Just computed the score for that choice and it's apparently #{choice.score}"
34 40 # choice.save!
35 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 42 end
39 43  
40 44 def skip!(prompt)
... ...
app/models/vote.rb
1 1 class Vote < ActiveRecord::Base
2   - belongs_to :voteable, :polymorphic => true, :counter_cache => true
  2 +# belongs_to :voteable, :polymorphic => true, :counter_cache => true
3 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 7 end
... ...
db/migrate/20100215170553_rename_votes_table.rb 0 → 100644
... ... @@ -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 @@
  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
... ...