Sha256: a85738b3a14c88ed7b9e2fea9af2f94de6ea9abe0da7efc5b07cbf78235ae7af

Contents?: true

Size: 1.36 KB

Versions: 1

Compression:

Stored size: 1.36 KB

Contents

# frozen_string_literal: true

require_relative '../base_adapter'
require_relative '../base_processor'

class ActiveSet
  class SortProcessor < BaseProcessor
    class ActiveRecordAdapter < BaseAdapter
      def process
        return return_set unless @set.respond_to? :to_sql
        return return_set unless attribute_is_field?

        return_set(processed_set)
      end

      private

      def attribute_is_field?
        return false unless attribute_model
        attribute_model.attribute_names
                       .include?(@instruction.attribute)
      end

      def processed_set
        @set.includes(@instruction.associations_hash)
            .references(@instruction.associations_hash)
            .merge(arel_operation)
      end

      def arel_operation
        column = case_insensitive? ? arel_column.lower : arel_column
        attribute_model.order(column.send(@instruction.value))
      end

      def attribute_model
        @instruction.associations_array
                    .reduce(@set.klass) do |obj, assoc|
                      obj.reflections[assoc.to_s]&.klass
                    end
      end

      def arel_column
        arel_table[@instruction.attribute]
      end

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

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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
activeset-0.5.8 lib/active_set/processors/sort/active_record_adapter.rb