]> projects.mako.cc - selectricity/blob - app/models/vote.rb
f263a75bb687d332527bc5ce938ada35ab4eb9b2
[selectricity] / app / models / vote.rb
1 class Vote < ActiveRecord::Base
2   # relationships to other classes
3   belongs_to :voter
4   has_many :rankings
5   has_one :token
6   
7   # callbacks
8   after_update :save_rankings
9   before_destroy :destroy_rankings
10
11   def to_s
12     votes.join("")
13   end
14
15   def each
16     self.votes.each {|vote| yield vote}
17   end
18
19   def votes
20     unless @votes
21       if rankings.empty?
22         @votes = Array.new
23       else
24         @votes = rankings.sort.collect { |ranking| ranking.candidate.id }
25       end
26     end
27
28     @votes
29   end
30
31   def votes=(array)
32     @votes = array
33   end
34
35   def save_rankings
36     destroy_rankings
37     self.votes.each_with_index do |candidate_id, index| 
38       ranking = Ranking.new
39       ranking.rank = index
40       ranking.candidate =  Candidate.find(candidate_id)
41       self.rankings << ranking
42     end
43   end
44   
45   def destroy
46     self.destroy_rankings
47     super
48   end
49
50   def destroy_rankings 
51     rankings.each { |ranking| ranking.destroy }
52   end
53
54   def confirm!
55     self.confirmed = 1
56     self.save
57     
58     unless self.voter.election.quickvote?
59       token.destroy and token.reload if token
60       self.token = Token.new
61       self.save
62     end
63   end
64
65   def confirm?
66     confirmed == 1
67   end
68   
69   def votestring=(string="")
70     candidate_ids = voter.election.candidates.sort.collect \
71       { |candidate| candidate.id.to_i }
72
73     rel_votes = string.split("").collect { |vote| vote.to_i }
74     
75     # covert relative orders to absolute candidate ids
76     self.votes = rel_votes.collect { |vote| candidate_ids[ vote - 1 ] }
77   end
78
79   def votestring
80     # create a mapping of candidates ids and the relative order of the
81     # candidates as they appear when sorted alphabetically
82     cand_relnums = {}
83     self.voter.election.candidates.sort.each_with_index do |c, i|
84       cand_relnums[c.id] = i + 1
85     end
86
87     # assemble the votestring
88     self.votes.collect {|v| cand_relnums[v]}.join("")
89   end
90
91   # the following subroutine is used for quickvotes. it creates a vote
92   # with the candidates listed in order of preference based on
93   # alphabetical order. it is meant to be manipulated and then confirmed
94   def set_defaults!
95     self.votes =  voter.election.candidates.sort.collect {|c| c.id }
96     self.save
97   end
98 end

Benjamin Mako Hill || Want to submit a patch?