From 2a7a19c93ee0e0d77e4e388d43f36a721c7ab715 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 20 Oct 2023 21:27:06 -0400 Subject: Added post voting --- app/models/blog.rb | 1 + app/models/concerns/votable.rb | 43 ++++++++++++++++++++++++++++++++++++++++++ app/models/vote.rb | 6 ++++++ 3 files changed, 50 insertions(+) create mode 100644 app/models/concerns/votable.rb create mode 100644 app/models/vote.rb (limited to 'app/models') diff --git a/app/models/blog.rb b/app/models/blog.rb index 6db75ec..03643bf 100644 --- a/app/models/blog.rb +++ b/app/models/blog.rb @@ -1,5 +1,6 @@ class Blog < ApplicationRecord include Recordable + include Votable acts_as_taggable diff --git a/app/models/concerns/votable.rb b/app/models/concerns/votable.rb new file mode 100644 index 0000000..ba6e6d5 --- /dev/null +++ b/app/models/concerns/votable.rb @@ -0,0 +1,43 @@ +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 diff --git a/app/models/vote.rb b/app/models/vote.rb new file mode 100644 index 0000000..e2d8386 --- /dev/null +++ b/app/models/vote.rb @@ -0,0 +1,6 @@ +class Vote < ApplicationRecord + belongs_to :votable, polymorphic: true + + validates :upvote, presence: true, inclusion: { in: [0, 1] } + validates :ip, presence: true +end -- cgit 1.4.1