class ActiveSet::Sorting::EnumerableStrategy
Public Class Methods
new(set, attribute_instructions)
click to toggle source
# File lib/active_set/sorting/enumerable_strategy.rb, line 9 def initialize(set, attribute_instructions) @set = set @attribute_instructions = attribute_instructions @set_instructions = attribute_instructions.map do |attribute_instruction| EnumerableSetInstruction.new(attribute_instruction, set) end end
Public Instance Methods
direction_multiplier(direction)
click to toggle source
# File lib/active_set/sorting/enumerable_strategy.rb, line 46 def direction_multiplier(direction) return -1 if direction.to_s.downcase.start_with? 'desc' 1 end
execute()
click to toggle source
# File lib/active_set/sorting/enumerable_strategy.rb, line 17 def execute # http://brandon.dimcheff.com/2009/11/18/rubys-sort-vs-sort-by/ @set.sort_by do |item| @set_instructions.map do |set_instruction| value_for_comparison = sortable_numeric_for(set_instruction, item) direction_multiplier = direction_multiplier(set_instruction.value) # When ActiveSet.configuration.on_asc_sort_nils_come == :last # null values to be sorted as if larger than any non-null value. # ASC => [-2, -1, 1, 2, nil] # DESC => [nil, 2, 1, -1, -2] # Otherwise sort nulls as if smaller than any non-null value. # ASC => [nil, -2, -1, 1, 2] # DESC => [2, 1, -1, -2, nil] if value_for_comparison.nil? [direction_multiplier * nil_sorter, 0] else [0, value_for_comparison * direction_multiplier] end end end end
nil_sorter()
click to toggle source
# File lib/active_set/sorting/enumerable_strategy.rb, line 52 def nil_sorter return 1 if ActiveSet.configuration.on_asc_sort_nils_come == :last -1 end
sortable_numeric_for(set_instruction, item)
click to toggle source
# File lib/active_set/sorting/enumerable_strategy.rb, line 40 def sortable_numeric_for(set_instruction, item) value = set_instruction.attribute_value_for(item) transform_to_sortable_numeric(value) end