Module: VotableItem
- Extended by:
- ActiveSupport::Concern
- Defined in:
- app/models/concerns/votable_item.rb
Overview
Model has votes
Instance Method Summary collapse
- #add_vote_result(delta) ⇒ Object
- #discard_vote_result(delta) ⇒ Object
- #vote_applicable?(vote_or_slug) ⇒ Boolean
- #vote_data(vote_or_slug) ⇒ Object
- #voted(vote_or_slug) ⇒ Object
Instance Method Details
#add_vote_result(delta) ⇒ Object
36 37 38 39 40 41 42 43 44 45 46 |
# File 'app/models/concerns/votable_item.rb', line 36 def add_vote_result(delta) return unless has_attribute?(:data) vote_data = data['votes'].to_h key = delta.positive? ? 'up' : 'down' vote_data[key] = vote_data.key?(key) ? vote_data[key].to_i + 1 : 1 vote_data['total'] = vote_data.key?('total') ? vote_data['total'] + delta : delta self.data['votes'] = vote_data save end |
#discard_vote_result(delta) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 |
# File 'app/models/concerns/votable_item.rb', line 49 def discard_vote_result(delta) return unless has_attribute?(:data) vote_data = data['votes'].to_h key = delta.positive? ? 'up' : 'down' vote_data[key] = vote_data[key].to_i - 1 if vote_data[key].to_i.positive? vote_data['total'] = vote_data['total'].to_i - delta self.data['votes'] = vote_data save end |
#vote_applicable?(vote_or_slug) ⇒ Boolean
12 13 14 15 |
# File 'app/models/concerns/votable_item.rb', line 12 def vote_applicable?(vote_or_slug) slug = vote_or_slug.is_a?(String) ? vote_or_slug : vote_or_slug.slug !Vote.voted?(slug, self) end |
#vote_data(vote_or_slug) ⇒ Object
18 19 20 21 22 23 24 25 |
# File 'app/models/concerns/votable_item.rb', line 18 def vote_data(vote_or_slug) { upvote_count: data.dig('votes', 'up'), downvote_count: data.dig('votes', 'down'), vote_result: data.dig('votes', 'total'), vote_type: voted(vote_or_slug) } end |
#voted(vote_or_slug) ⇒ Object
28 29 30 31 32 33 |
# File 'app/models/concerns/votable_item.rb', line 28 def voted(vote_or_slug) vote = vote_or_slug.is_a?(String) ? votes.find_by(slug: vote_or_slug) : vote_or_slug return :none if vote&.id.nil? vote.upvote? ? :upvote : :downvote end |