Sha256: 46f020244b9de23fd2eb862d97b7b07b84786f8b298b4c55bf88bd989a3b28f4

Contents?: true

Size: 1.41 KB

Versions: 2

Compression:

Stored size: 1.41 KB

Contents

# frozen_string_literal: true

require_relative '../adapter_activerecord'
require_relative '../processor_base'
require_relative '../../helpers/throws'

class ActiveSet
  class Processor::Sort < Processor::Base
    class ActiveRecordOperation
      def initialize(instruction, klass)
        @instruction = instruction
        @klass = klass
      end

      def operation
        attribute_model.order(column.send(validate_direction(@instruction.value)))
      end

      def attribute_is_field?
        return false unless attribute_model

        attribute_model.attribute_names
                       .include?(@instruction.attribute)
      end

      def case_insensitive?
        @instruction.operator.to_s.downcase == 'i'
      end

      def column
        column = table[@instruction.attribute]
        case_insensitive? ? column.lower : column
      end

      def table
        Arel::Table.new(attribute_model.table_name)
      end

      def validate_direction(direction)
        return 'desc' if direction.to_s.downcase.start_with? 'desc'

        'asc'
      end

      def attribute_model
        tmp_model = @instruction.associations_array
                                .reduce(@klass) do |obj, assoc|
                                  obj.reflections[assoc.to_s]&.klass
                                end
        # return tmp_model.klass if tmp_model.is_a?(ActiveRecord::Relation)
        # tmp_model
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
activeset-0.6.5 lib/active_set/processor_sort/active_record_operation.rb
activeset-0.6.4 lib/active_set/processor_sort/active_record_operation.rb