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