class Might::SortParametersExtractor
User provided sorting syntax:
* `name` - sort by name * `-name` - sort by name in reversed order * `-name,created_at` - sort by name in reversed order, and then sort by created_at
This middleware parses sorting string and builds Parameter array @see Might::Sort::Parameter
If user passes not defined sort order, it yields to `UndefinedParameter`, so you may validate it.
Attributes
app[R]
parameters_definition[R]
Public Class Methods
new(app, parameters_definition)
click to toggle source
@param app [#call] @param parameters_definition
[Set<Might::SortParameterDefinition>]
# File lib/might/sort_parameters_extractor.rb, line 17 def initialize(app, parameters_definition) @app = app @parameters_definition = parameters_definition end
Public Instance Methods
call(env)
click to toggle source
@param env [<String, []>]
* first element is a scope to be sorted * second is a String with user provided sortings
@return [<<Might::RansackableSort::SortParameter, []>]
# File lib/might/sort_parameters_extractor.rb, line 27 def call(env) params, errors = env sort_params = sort_order(params[:sort]).map do |(attribute, direction)| extract_parameter(attribute, direction) end app.call([params.merge(sort: sort_params), errors]) end
Private Instance Methods
extract_parameter(name, direction)
click to toggle source
# File lib/might/sort_parameters_extractor.rb, line 41 def extract_parameter(name, direction) definition = parameters_definition.detect { |d| d.as == name } || SortUndefinedParameter.new(name) SortParameter.new(direction, definition) end
sort_order(params)
click to toggle source
# File lib/might/sort_parameters_extractor.rb, line 46 def sort_order(params) String(params).split(',').map do |attribute| sorting_for(attribute) end end
sorting_for(field)
click to toggle source
# File lib/might/sort_parameters_extractor.rb, line 52 def sorting_for(field) if field.start_with?('-') [field.delete('-'), 'desc'] else [field, 'asc'] end end