Sha256: b74e571d47f4bcbaad0a26df067f7e95ef2f483f9b7e54df90ef3347e4e2592e
Contents?: true
Size: 1.73 KB
Versions: 3
Compression:
Stored size: 1.73 KB
Contents
# frozen_string_literal: true module ApiMe class Sorting attr_accessor :sort_criteria, :sort_reverse, :scope, :custom_sort_options def initialize(scope:, sort_params:, custom_sort_options: {}) self.scope = scope return unless sort_params self.sort_criteria = sort_params[:criteria] || default_sort_criteria self.sort_reverse = sort_params[:reverse] || false self.custom_sort_options = custom_sort_options end def results sorting? ? sort(sort_criteria).scope : scope end def sort_meta return {} unless sorting? { criteria: sort_meta_criteria, reverse: sort_reverse } end protected def sort_meta_criteria if sort_criteria.blank? default_sort_criteria else sort_criteria end end def sort(criteria = default_sort_criteria) self.scope = sorted_scope(criteria) self end def sorted_scope(criteria) criteria_key = criteria.to_sym if custom_sort_options.key?(criteria_key) if sort_reverse == 'true' custom_sort_scope(criteria_key).order(Arel.sql("#{custom_sort_options[criteria_key][:column]} DESC")) else custom_sort_scope(criteria_key).order(Arel.sql("#{custom_sort_options[criteria_key][:column]} ASC")) end elsif sort_reverse == 'true' scope.order(criteria => :desc) else scope.order(criteria => :asc) end end private def custom_sort_scope(criteria) custom_sort_options[criteria].key?(:joins) ? scope.joins(custom_sort_options[criteria][:joins]) : scope end def default_sort_criteria 'id' end def sorting? sort_criteria || sort_reverse end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
api_me-0.14.1 | lib/api_me/sorting.rb |
api_me-0.14.0 | lib/api_me/sorting.rb |
api_me-0.13.0 | lib/api_me/sorting.rb |