Added processing and presentatin of results.
[selectricity-live] / 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     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, index| 
38       ranking = Ranking.new
39       ranking.rank = index
40       ranking.candidate =  Candidate.find(candidate)
41       self.rankings << ranking
42     end
43   end
44
45   def destroy_rankings 
46     rankings.each { |ranking| ranking.destroy }
47   end
48
49   def confirm!
50     self.confirmed = 1
51     self.save
52
53     token.destroy and token.reload if token
54     self.token = Token.new
55     self.save
56   end
57
58   def confirm?
59     if confirm == 1
60       return true
61     else 
62       return false
63     end
64   end
65   
66   def votestring=(string="")
67     candidate_ids = voter.election.candidates.sort.collect \
68       { |candidate| candidate.id.to_i }
69
70     rel_votes = string.split("").collect { |vote| vote.to_i }
71     
72     # covert relative orders to absolute candidate ids
73     self.votes = rel_votes.collect { |vote| candidate_ids[ vote - 1 ] }
74   end
75
76 end

Benjamin Mako Hill || Want to submit a patch?