cirandas.net

ref: master

vendor/plugins/kandadaboggu-vote_fu/lib/acts_as_voter.rb


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# ActsAsVoter
module PeteOnRails
  module Acts #:nodoc:
    module Voter #:nodoc:

      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods
        def acts_as_voter
          has_many :votes, :as => :voter, :dependent => :nullify  # If a voting entity is deleted, keep the votes.
          include PeteOnRails::Acts::Voter::InstanceMethods
          extend  PeteOnRails::Acts::Voter::SingletonMethods
        end
      end

      # This module contains class methods
      module SingletonMethods
      end

      # This module contains instance methods
      module InstanceMethods

        # Usage user.vote_count(true)  # All +1 votes
        #       user.vote_count(false) # All -1 votes
        #       user.vote_count()      # All votes
        #
        def vote_count(for_or_against = "all")
          return self.votes.size if for_or_against == "all"
          self.votes.where(vote: if for_or_against then 1 else -1 end).count
        end

        def voted_for?(voteable)
          voteable.voted_by?(self, true)
        end

        def voted_against?(voteable)
          voteable.voted_by?(self, false)
        end

        def voted_on?(voteable)
          voteable.voted_by?(self)
        end

        def vote_for(voteable)
          self.vote(voteable, 1)
        end

        def vote_against(voteable)
          self.vote(voteable, -1)
        end

        def vote(voteable, vote)
          Vote.create(:vote => vote, :voteable => voteable, :voter => self).tap do |v|
            voteable.reload_vote_counter if !v.new_record? and voteable.respond_to?(:reload_vote_counter)
          end.errors.empty?
        end

      end

    end

  end
end