lib/sakuramochi/predicate_builder.rb in sakuramochi-0.2.1 vs lib/sakuramochi/predicate_builder.rb in sakuramochi-0.5.0
- old
+ new
@@ -17,11 +17,11 @@
predicates = attributes.map do |column, value|
table = default_table
if value.is_a?(Hash)
table = Arel::Table.new(column, engine)
- build_from_hash(engine, value, table)
+ build_from_hash_with_predicate(engine, value, table)
else
column = column.to_s
if column.include?('.')
table_name, column = column.split('.', 2)
@@ -40,10 +40,12 @@
end
predicates.flatten.compact
end
+ private
+
def build_attribute_with_predicate(attribute, value, predicate)
if predicate.validate(value)
if predicate.converter
attribute.send(predicate.arel_predicate, predicate.convert(value))
else
@@ -59,24 +61,27 @@
case value
when ActiveRecord::Relation
value = value.select(value.klass.arel_table[value.klass.primary_key]) if value.select_values.empty?
attribute.in(value.arel.ast)
when Array, ActiveRecord::Associations::CollectionProxy
- values = value.to_a.map { |x|
- x.is_a?(ActiveRecord::Base) ? x.id : x
- }
+ when Array, ActiveRecord::Associations::CollectionProxy
+ values = value.to_a.map {|x| x.is_a?(ActiveRecord::Base) ? x.id : x}
+ ranges, values = values.partition {|v| v.is_a?(Range) || v.is_a?(Arel::Relation)}
+ array_predicates = ranges.map {|range| attribute.in(range)}
+
if values.include?(nil)
values = values.compact
if values.empty?
- attribute.eq nil
+ array_predicates << attribute.eq(nil)
else
- attribute.in(values.compact).or attribute.eq(nil)
+ array_predicates << attribute.in(values.compact).or(attribute.eq(nil))
end
else
- attribute.in(values)
+ array_predicates << attribute.in(values)
end
+ array_predicates.inject {|composite, predicate| composite.or(predicate)}
when Range, Arel::Relation
attribute.in(value)
when ActiveRecord::Base
attribute.eq(value.id)
when Class