Class: ActiveScaffold::DataStructures::Sorting
- Includes:
- OrmChecks, Enumerable
- Defined in:
- lib/active_scaffold/data_structures/sorting.rb
Overview
encapsulates the column sorting configuration for the List view
Constant Summary collapse
- SORTING_STAGES =
Hash[%w[reset ASC DESC reset].each_cons(2).to_a].freeze
- DEFAULT_SORTING_STAGES =
Hash[%w[ASC DESC ASC].each_cons(2).to_a].freeze
Instance Attribute Summary collapse
-
#constraint_columns ⇒ Object
Returns the value of attribute constraint_columns.
-
#model ⇒ Object
(also: #active_record_class)
readonly
Returns the value of attribute model.
-
#sorting_by_primary_key ⇒ Object
enabled by default for postgres.
Instance Method Summary collapse
-
#<<(arg) ⇒ Object
an alias for
add
. -
#add(column_name, direction = nil) ⇒ Object
add a clause to the sorting, assuming the column is sortable.
-
#clause(grouped_columns_calculations = nil) ⇒ Object
builds an order-by clause.
-
#clear ⇒ Object
clears the sorting.
- #direction_of(column) ⇒ Object
-
#each ⇒ Object
iterate over the clauses.
- #each_column ⇒ Object
-
#first ⇒ Object
provides quick access to the first (and sometimes only) clause.
-
#initialize(columns, model) ⇒ Sorting
constructor
A new instance of Sorting.
- #next_sorting_of(column, sorted_by_default) ⇒ Object
-
#set(*args) ⇒ Object
clears the sorting before setting to the given column/direction set(column, direction) set(=> direction, column => direction) set(=> direction, => direction) set([column, direction], [column, direction]).
- #set_default_sorting ⇒ Object
- #set_nested_sorting(table_name, order_clause) ⇒ Object
- #size ⇒ Object
-
#sorts_by_method? ⇒ Boolean
checks whether any column is configured to sort by method (using a proc).
- #sorts_by_sql? ⇒ Boolean
-
#sorts_on?(column) ⇒ Boolean
checks whether the given column (a Column object or a column name) is in the sorting.
Methods included from OrmChecks
active_record?, column_type, columns, columns_hash, content_columns, mongoid?, quoted_table_name, reflect_on_all_associations, table_name, tableless?, type_for_attribute
Constructor Details
#initialize(columns, model) ⇒ Sorting
Returns a new instance of Sorting.
12 13 14 15 16 17 18 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 12 def initialize(columns, model) @columns = columns @clauses = [] @constraint_columns = [] @model = model @sorting_by_primary_key = false end |
Instance Attribute Details
#constraint_columns ⇒ Object
Returns the value of attribute constraint_columns.
7 8 9 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 7 def constraint_columns @constraint_columns end |
#model ⇒ Object (readonly) Also known as: active_record_class
Returns the value of attribute model.
9 10 11 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 9 def model @model end |
#sorting_by_primary_key ⇒ Object
enabled by default for postgres
8 9 10 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 8 def sorting_by_primary_key @sorting_by_primary_key end |
Instance Method Details
#<<(arg) ⇒ Object
an alias for add
. must accept its arguments in a slightly different form, though.
49 50 51 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 49 def <<(arg) add(*arg) end |
#add(column_name, direction = nil) ⇒ Object
add a clause to the sorting, assuming the column is sortable
38 39 40 41 42 43 44 45 46 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 38 def add(column_name, direction = nil) direction ||= 'ASC' direction = direction.to_s.upcase column = get_column(column_name) raise ArgumentError, "Could not find column #{column_name}" if column.nil? raise ArgumentError, 'Sorting direction unknown' unless %i[ASC DESC].include? direction.to_sym @clauses << [column, direction] if column.sortable? raise ArgumentError, "Can't mix :method- and :sql-based sorting" if mixed_sorting? end |
#clause(grouped_columns_calculations = nil) ⇒ Object
builds an order-by clause
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 124 def clause(grouped_columns_calculations = nil) return nil if sorts_by_method? || default_sorting? # unless the sorting is by method, create the sql string order = [] each do |sort_column, sort_direction| next if constraint_columns.include? sort_column.name sql = grouped_columns_calculations&.dig(sort_column.name) || sort_column.sort[:sql] next if sql.blank? sql = sql.to_sql if sql.respond_to?(:to_sql) parts = Array(sql).map do |column| mongoid? ? [column, sort_direction] : "#{column} #{sort_direction}" end order << parts end order << @primary_key_order_clause if @sorting_by_primary_key order.flatten!(1) order unless order.empty? end |
#clear ⇒ Object
clears the sorting
73 74 75 76 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 73 def clear @default_sorting = false @clauses = [] end |
#direction_of(column) ⇒ Object
83 84 85 86 87 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 83 def direction_of(column) clause = get_clause(column) return if clause.nil? clause[1] end |
#each ⇒ Object
iterate over the clauses
106 107 108 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 106 def each @clauses.each { |clause| yield clause } end |
#each_column ⇒ Object
110 111 112 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 110 def each_column @clauses.each { |clause| yield clause[0] } end |
#first ⇒ Object
provides quick access to the first (and sometimes only) clause
115 116 117 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 115 def first @clauses.first end |
#next_sorting_of(column, sorted_by_default) ⇒ Object
91 92 93 94 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 91 def next_sorting_of(column, sorted_by_default) stages = sorted_by_default ? DEFAULT_SORTING_STAGES : SORTING_STAGES stages[direction_of(column)] || 'ASC' end |
#set(*args) ⇒ Object
clears the sorting before setting to the given column/direction set(column, direction) set(=> direction, column => direction) set(=> direction, => direction) set([column, direction], [column, direction])
58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 58 def set(*args) # TODO: add deprecation unless args.size == 1 && args[0].is_a? Hash # when deprecation is removed: # * change list#sorting= to sorting.set(val) clear if args.first.is_a?(Enumerable) args.each do |h| h.is_a?(Hash) ? h.each { |c, d| add(c, d) } : add(*h) end else add(*args) end end |
#set_default_sorting ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 20 def set_default_sorting return unless active_record? # fallback to setting primary key ordering setup_primary_key_order_clause model_scope = model.send(:build_default_scope) order_clause = model_scope.order_values.join(',') if model_scope return unless order_clause # If an ORDER BY clause is found set default sorting according to it set_sorting_from_order_clause(order_clause, model.table_name) @default_sorting = true end |
#set_nested_sorting(table_name, order_clause) ⇒ Object
32 33 34 35 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 32 def set_nested_sorting(table_name, order_clause) clear set_sorting_from_order_clause(order_clause, table_name) end |
#size ⇒ Object
119 120 121 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 119 def size @clauses.size end |
#sorts_by_method? ⇒ Boolean
checks whether any column is configured to sort by method (using a proc)
97 98 99 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 97 def sorts_by_method? @clauses.any? { |sorting| sorting[0].sort.is_a?(Hash) && sorting[0].sort.key?(:method) } end |
#sorts_by_sql? ⇒ Boolean
101 102 103 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 101 def sorts_by_sql? @clauses.any? { |sorting| sorting[0].sort.is_a?(Hash) && sorting[0].sort.key?(:sql) } end |
#sorts_on?(column) ⇒ Boolean
checks whether the given column (a Column object or a column name) is in the sorting
79 80 81 |
# File 'lib/active_scaffold/data_structures/sorting.rb', line 79 def sorts_on?(column) !get_clause(column).nil? end |