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