zhishi-engine/zhishi-backend

View on GitHub
app/models/queries/votes_query.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Queries
  class VotesQuery
    attr_reader :relation

    def initialize(relation)
      @relation = relation
    end

    def call
      relation.joins(join_associations).select(resource_data, total_votes).group("#{relation.table_name}.id")
    end

    private
      def votes_table
        Vote.arel_table
      end

      def resource_table
        relation.arel_table
      end

      def total_votes
        votes_table[:value].sum.as("total_votes")
      end

      def resource_data
        resource_table[Arel.star]
      end

      def join_associations
        resource_table.outer_join(votes_table).on(resource_table[:id].eq(votes_table[:voteable_id]).
        and(votes_table[:voteable_type].eq(relation.to_s))).join_sources
      end
  end
end