class ArelHash::ArelHashFactory

Public Class Methods

new(properties) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 3
def initialize(properties)
  @properties = properties
end

Private Class Methods

make_canonical(values) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 50
def self.make_canonical(values)
  values.map { |v| v.is_a?(Array) ? v : [v] }
end

Public Instance Methods

create_from_active_record(hash) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 7
def create_from_active_record(hash)
  { :and => hash.map { |k, v| name_value_to_arel_hash(k.to_sym, v) } }
end

Private Instance Methods

arel_hash_for_array_value(attr_name, values) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 25
def arel_hash_for_array_value(attr_name, values)
  { or: self.class.make_canonical(values).map do |option|
    { and: option.map do |requirement|
      arel_hash_for_singleton_value(attr_name, requirement)
    end }
  end }
end
arel_hash_for_range_value(attr_name, range) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 33
def arel_hash_for_range_value(attr_name, range)
  { and: [create_arel_hash_tuple(:gteq, attr_name, range.first),
          create_arel_hash_tuple(range.exclude_end? ? :lt : :lt_eq, attr_name, range.end)] }
end
arel_hash_for_singleton_value(attr_name, value) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 38
def arel_hash_for_singleton_value(attr_name, value)
  create_arel_hash_tuple(:eq, attr_name, value)
end
create_arel_hash_tuple(predication, attr_name, value) click to toggle source
# File lib/arel_hash/arel_hash_factory.rb, line 42
def create_arel_hash_tuple(predication, attr_name, value)
  if @properties.fetch(attr_name.to_s, {})['multivalue']
    { "#{predication}_any".to_sym => { value => attr_name } }
  else
    { predication => { attr_name => value } }
  end
end
name_value_to_arel_hash(attr_name, value) click to toggle source

converts a tuple from a where hash (as in ActiveRecord where) to a valid arel_hash expression

# File lib/arel_hash/arel_hash_factory.rb, line 14
def name_value_to_arel_hash(attr_name, value)
  case value
  when Array
    arel_hash_for_array_value(attr_name, value)
  when Range
    arel_hash_for_range_value(attr_name, value)
  else
    arel_hash_for_singleton_value(attr_name, value)
  end
end