class Thorderbolt::BaseQueryBuilder

Builds full query for performing custom ordering

Attributes

attribute[R]
table_name[R]
values[R]

Public Class Methods

new(table_name:, attribute:, values:) click to toggle source
# File lib/thorderbolt/base_query_builder.rb, line 8
def initialize(table_name:, attribute:, values:)
  @table_name = table_name
  @attribute = attribute
  @values = values
end

Public Instance Methods

build() click to toggle source

result example: CASE

WHEN 'cities'.'name'='City 1' THEN 0
WHEN 'cities'.'name'='City 5' THEN 1
ELSE 2

END ASC

# File lib/thorderbolt/base_query_builder.rb, line 20
def build
  conditions = build_conditions
  when_queries = build_when_then_part(conditions)
  case_query = build_case_else(when_queries)
  Arel.sql("#{case_query} ASC")
end

Protected Instance Methods

build_conditions() click to toggle source
# File lib/thorderbolt/base_query_builder.rb, line 29
def build_conditions
  values.map do |value|
    value.is_a?(Range) ? range_equality_part(value) : equality_part(value)
  end
end
equality_part(value) click to toggle source

result example: 'cities'.'name'

# File lib/thorderbolt/base_query_builder.rb, line 37
def equality_part(value)
  connection = ActiveRecord::Base.connection
  full_column_name = "#{connection.quote_table_name(table_name)}"\
                      ".#{connection.quote_column_name(attribute)}"

  ActiveRecord::Base.sanitize_sql(
    ["#{full_column_name} = :value", value: value]
  )
end
range_equality_part(value) click to toggle source

result example: 'cities'.'population' >= 100 AND 'cities'.'population' < 200

# File lib/thorderbolt/base_query_builder.rb, line 49
def range_equality_part(value)
  RangeBuilder.build(table_name, attribute, value)
end