42 lines
825 B
Ruby
42 lines
825 B
Ruby
# 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
|