Class: ActiveSet::Sorting::EnumerableStrategy
- Inherits:
-
Object
- Object
- ActiveSet::Sorting::EnumerableStrategy
- Defined in:
- lib/active_set/sorting/enumerable_strategy.rb
Instance Method Summary collapse
- #case_insensitive?(instruction, _value) ⇒ Boolean
- #direction_multiplier(direction) ⇒ Object
- #execute ⇒ Object
-
#initialize(set, attribute_instructions) ⇒ EnumerableStrategy
constructor
A new instance of EnumerableStrategy.
- #sortable_numeric_for(instruction, item) ⇒ Object
Constructor Details
#initialize(set, attribute_instructions) ⇒ EnumerableStrategy
Returns a new instance of EnumerableStrategy.
8 9 10 11 |
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 8 def initialize(set, attribute_instructions) @set = set @attribute_instructions = attribute_instructions end |
Instance Method Details
#case_insensitive?(instruction, _value) ⇒ Boolean
45 46 47 |
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 45 def case_insensitive?(instruction, _value) instruction.operator.to_s.casecmp('i').zero? end |
#direction_multiplier(direction) ⇒ Object
49 50 51 52 53 |
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 49 def direction_multiplier(direction) return -1 if direction.to_s.downcase.start_with? 'desc' 1 end |
#execute ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 13 def execute # http://brandon.dimcheff.com/2009/11/18/rubys-sort-vs-sort-by/ @set.sort_by do |item| @attribute_instructions.map do |instruction| value_for_comparison = sortable_numeric_for(instruction, item) direction_multiplier = direction_multiplier(instruction.value) # Force 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] if value_for_comparison.nil? [direction_multiplier, 0] else [0, value_for_comparison * direction_multiplier] end end end end |
#sortable_numeric_for(instruction, item) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/active_set/sorting/enumerable_strategy.rb', line 32 def sortable_numeric_for(instruction, item) value = instruction.value_for(item: item) if value.is_a?(String) || value.is_a?(Symbol) value = if case_insensitive?(instruction, value) value.to_s.downcase else value.to_s end end transform_to_sortable_numeric(value) end |