price-point-api/app/models/concerns/votable.rb

43 lines
825 B
Ruby
Raw Permalink Normal View History

2026-05-30 20:23:13 +00:00
# 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