module Votable extend ActiveSupport::Concern included do has_many :votes, as: :votable def already_upvoted?(ip) !votes.where(ip: ip, upvote: 1).empty? end def already_downvoted?(ip) !votes.where(ip: ip, upvote: 0).empty? end def upvote!(ip) return false if already_upvoted?(ip) if already_downvoted?(ip) votes.where(ip: ip, upvote: 0).first.delete self.downvotes -= 1 save! else votes.create(ip: ip, upvote: 1).save self.upvotes += 1 save! end end def downvote!(ip) return false if already_downvoted?(ip) if already_upvoted?(ip) votes.where(ip: ip, upvote: 1).first.delete self.upvotes -= 1 save! else votes.create(ip: ip, upvote: 0).save self.downvotes += 1 save! end end end end