Class: OrderQuery::OrderSpace
- Inherits:
-
Object
- Object
- OrderQuery::OrderSpace
- Defined in:
- lib/order_query/order_space.rb
Overview
Combine order specification with a scope
Constant Summary collapse
- SORT_DIRECTIONS =
[:asc, :desc].freeze
Instance Attribute Summary collapse
-
#conditions ⇒ Object
readonly
Returns the value of attribute conditions.
Instance Method Summary collapse
-
#initialize(scope, order_spec) ⇒ OrderSpace
constructor
A new instance of OrderSpace.
- #join_order_by_clauses(clauses) ⇒ Object
- #order_by_reverse_sql ⇒ String
- #order_by_reverse_sql_clauses ⇒ Array<String>
- #order_by_sql ⇒ String
- #order_by_sql_clauses ⇒ Array<String>
- #reverse_scope ⇒ ActiveRecord::Relation
- #scope ⇒ ActiveRecord::Relation
- #sort_direction_sql(direction) ⇒ String
Constructor Details
#initialize(scope, order_spec) ⇒ OrderSpace
Returns a new instance of OrderSpace.
9 10 11 12 |
# File 'lib/order_query/order_space.rb', line 9 def initialize(scope, order_spec) @scope = scope @conditions = order_spec.map { |spec| OrderCondition.new(scope, spec) } end |
Instance Attribute Details
#conditions ⇒ Object (readonly)
Returns the value of attribute conditions.
5 6 7 |
# File 'lib/order_query/order_space.rb', line 5 def conditions @conditions end |
Instance Method Details
#join_order_by_clauses(clauses) ⇒ Object
70 71 72 |
# File 'lib/order_query/order_space.rb', line 70 def join_order_by_clauses(clauses) clauses.join(', ').freeze end |
#order_by_reverse_sql ⇒ String
60 61 62 |
# File 'lib/order_query/order_space.rb', line 60 def order_by_reverse_sql join_order_by_clauses order_by_reverse_sql_clauses end |
#order_by_reverse_sql_clauses ⇒ Array<String>
52 53 54 55 56 57 |
# File 'lib/order_query/order_space.rb', line 52 def order_by_reverse_sql_clauses swap = {'DESC' => 'ASC', 'ASC' => 'DESC'} order_by_sql_clauses.map { |s| s.gsub(/DESC|ASC/) { |m| swap[m] } } end |
#order_by_sql ⇒ String
65 66 67 |
# File 'lib/order_query/order_space.rb', line 65 def order_by_sql join_order_by_clauses order_by_sql_clauses end |
#order_by_sql_clauses ⇒ Array<String>
36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/order_query/order_space.rb', line 36 def order_by_sql_clauses conditions.map { |cond| case order_spec = cond.order when Symbol "#{cond.col_name_sql} #{sort_direction_sql order_spec}".freeze when Enumerable order_spec.map { |v| "#{cond.col_name_sql}=#{@scope.connection.quote v} #{cond.order_order.to_s.upcase}" }.join(', ').freeze else raise ArgumentError.new("Invalid order #{order_spec.inspect} (#{cond.inspect})") end } end |
#reverse_scope ⇒ ActiveRecord::Relation
20 21 22 |
# File 'lib/order_query/order_space.rb', line 20 def reverse_scope @scope.order(order_by_reverse_sql) end |
#scope ⇒ ActiveRecord::Relation
15 16 17 |
# File 'lib/order_query/order_space.rb', line 15 def scope @scope.order(order_by_sql) end |
#sort_direction_sql(direction) ⇒ String
27 28 29 30 31 32 33 |
# File 'lib/order_query/order_space.rb', line 27 def sort_direction_sql(direction) if SORT_DIRECTIONS.include?(direction) direction.to_s.upcase.freeze else raise ArgumentError.new("sort direction must be in #{SORT_DIRECTIONS.map(&:inspect).join(', ')}, is #{direction.inspect}") end end |