Sha256: 686cbe10e617cdfdf7a63380ff72a229e00be222d6a96335336987bfe0e9952a

Contents?: true

Size: 1.52 KB

Versions: 4

Compression:

Stored size: 1.52 KB

Contents

module DataTables
  module Modules
    class Order

      attr_reader :scope, :context

      def initialize(model, scope, params)
        @scope = scope.dup
        @model = model
        @params = params
      end

      def order
        columns = orderable_columns(@params[:order], @params[:columns])

        orders = DataTables::Responder.flat_keys_to_nested columns

        order_by, join_hash = build_order(@model, orders)

        @scope = @scope.joins(join_hash)

        order_by.inject(@scope) { |r, o| r.order(o) }
      end

      def build_order(model, in_hash, join_hash = nil)
        # Tuple!
        return in_hash.inject([]) { |sum, (k, h)|
          case h
          when Hash
            if (klass = model.reflect_on_association(k).try(:klass))

              new_sum, join_class = build_order(klass, h)

              join_hash = join_class.nil? ? [k] : {k => join_class}

              sum += new_sum
            else
              warn("trying to reflect on #{k} but #{model.class.name} has no such association.")
            end
          else
            sum << model.arel_table[k].send(h) if model.column_names.include?(k.to_s)
          end
          sum
        }, join_hash
      end

      protected

      def orderable_columns(orders, columns)
        orders&.inject({}) do |collection, order|
          column = columns[order[:column]]
          if (column[:orderable] && column[:data].present?)
            collection[column[:data]] = order[:dir]
          end
          collection
        end
      end

    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
data_tables-responder-0.4.4rc1 lib/data_tables/modules/order.rb
data_tables-responder-0.4.3 lib/data_tables/modules/order.rb
data_tables-responder-0.5.0rc1 lib/data_tables/modules/order.rb
data_tables-responder-0.4.2 lib/data_tables/modules/order.rb