Sha256: f262548b8760583e4cc07bc97f5dc6c6b3e2c710e514c05136264856c8945241

Contents?: true

Size: 1.23 KB

Versions: 6

Compression:

Stored size: 1.23 KB

Contents

module ActiveHouse
  module Orderable
    extend ActiveSupport::Concern

    included do
      private

      def build_order_by_query_part
        "ORDER BY #{@ordering.join(', ')}" unless @ordering.empty?
      end
    end

    def initialize(*)
      @ordering = []
      super
    end

    def order_by(*clauses)
      raise ArgumentError, 'wrong number of arguments' if clauses.empty?
      formatter_clauses = clauses.map do |clause|
        if clause.is_a?(String)
          clause
        elsif clause.is_a?(Symbol)
          clause.to_s
        elsif clause.is_a?(Hash)
          if clause.keys.one?
            direction = clause.values.first
            raise ArgumentError, 'direction must be asc or desc' if [:asc, :desc].exclude?(direction.try!(:to_sym))
            "#{clause.keys.first} #{direction.to_s.upcase}"
          else
            clause.assert_valid_keys(:field, :direction, :collate)
            [
                clause.fetch(:field),
                clause[:direction].try!(:to_s).try!(:upcase),
                clause.key?(:collate) ? "COLLATE '#{clause[:collate]}'" : nil
            ].reject(&:nil?).join(' ')
          end
        end
      end
      chain_query ordering: (@ordering + formatter_clauses).uniq
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
active_house-0.1.5 lib/active_house/orderable.rb
active_house-0.1.4 lib/active_house/orderable.rb
active_house-0.1.3 lib/active_house/orderable.rb
active_house-0.1.2 lib/active_house/orderable.rb
active_house-0.1.1 lib/active_house/orderable.rb
active_house-0.1.0 lib/active_house/orderable.rb