# frozen_string_literal: true module Votable extend ActiveSupport::Concern included do has_many :votes, as: :votable, dependent: :destroy end def upvote!(user) vote = votes.find_by(user:) if vote if vote.upvote? vote.destroy! else vote.update!(direction: :upvote) end else Vote.create!(user: user, votable: self, direction: :upvote) end end def downvote!(user) vote = votes.find_by(user:) if vote if vote.downvote? vote.destroy! else vote.update!(direction: :downvote) end else Vote.create!(user: user, votable: self, direction: :downvote) end end def upvote_count votes.where(direction: :upvote).count end def downvote_count votes.where(direction: :downvote).count end end