app/models/concerns/votes_counter.rb
module VotesCounter
extend ActiveSupport::Concern
included do
scope :with_votes, Queries::VotesQuery.new(self)
scope :ordered_by_top, -> {
with_votes.order('total_votes DESC, created_at DESC')
}
scope :top, ->(needed=10) {
ordered_by_top.paginate(per_page: needed, page: 1)
}
scope :by_date, -> {
with_votes.order("#{table_name}.created_at DESC")
}
end
def votes_count
if respond_to? :total_votes
total_votes.to_i
else
votes_alternative
end
end
def votes_alternative
votes.reduce(0) do |sum , vote|
sum + vote.value
end
end
def vote_by(user)
vote = votes.find { |vote| vote.user_id == user.id }
vote ? vote.value : nil
end
end