Sha256: 1b5d2061e7e220fb9c17af519e30a8a9a756c9fc64ea3d6da506f05f46b66c80

Contents?: true

Size: 1.35 KB

Versions: 16

Compression:

Stored size: 1.35 KB

Contents

# frozen_string_literal: true

# This concern is used to provide abstract ordering based on `params[:sort]`
module Orderable
  extend ActiveSupport::Concern
  SORT_ORDER = { '+' => :asc, '-' => :desc }.freeze

  # A list of the param names that can be used for ordering the model list
  def ordering_params(params)
    # For example it retrieves a list of orders in descending order of total_value.
    # Within a specific total_value, older orders are ordered first
    #
    # GET /orders?sort=-total_value,created_at
    # ordering_params(params) # => { total_value: :desc, created_at: :asc }
    #
    # Usage:
    # Order.order(ordering_params(params))
    ordering = {}
    params[:sort].try(:split, ',').try(:each) do |attr|
      parsed_attr = parse_attr attr
      if model.attribute_names.include?(parsed_attr)
        ordering[parsed_attr] = SORT_ORDER[parse_sign attr]
      end
    end
    ordering
  end

  private

  # Parsing of attributes to avoid empty starts in case browser passes "+" as " "
  def parse_attr(attr)
    return attr.gsub(/^\ (.*)/, '\1') if attr.starts_with?(' ')
    attr[1..-1]
  end

  # Ordering sign parse, which separates
  def parse_sign(attr)
    attr =~ /\A[+-]/ ? attr.slice!(0) : '+'
  end

  def model
    (params[:resource] || params[:nested] || controller_name).classify.constantize
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
apicasso-0.2.14 app/controllers/concerns/orderable.rb
apicasso-0.2.13 app/controllers/concerns/orderable.rb
apicasso-0.2.12 app/controllers/concerns/orderable.rb
apicasso-0.2.11 app/controllers/concerns/orderable.rb
apicasso-0.2.10 app/controllers/concerns/orderable.rb
apicasso-0.2.9 app/controllers/concerns/orderable.rb
apicasso-0.2.8 app/controllers/concerns/orderable.rb
apicasso-0.2.7 app/controllers/concerns/orderable.rb
apicasso-0.2.6 app/controllers/concerns/orderable.rb
apicasso-0.2.5 app/controllers/concerns/orderable.rb
apicasso-0.2.4 app/controllers/concerns/orderable.rb
apicasso-0.2.3 app/controllers/concerns/orderable.rb
apicasso-0.2.2 app/controllers/concerns/orderable.rb
apicasso-0.2.1 app/controllers/concerns/orderable.rb
apicasso-0.2.0 app/controllers/concerns/orderable.rb
apicasso-0.1.6 app/controllers/concerns/orderable.rb