Sha256: 8d730aa5bc735ae3bee22638fbe0b07d93559fd3e85c51b6df9963df01a852a5
Contents?: true
Size: 1.36 KB
Versions: 3
Compression:
Stored size: 1.36 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 parsed_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
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
apicasso-0.1.2 | app/controllers/concerns/orderable.rb |
apicasso-0.1.1 | app/controllers/concerns/orderable.rb |
apicasso-0.1.0 | app/controllers/concerns/orderable.rb |