diff options
-rw-r--r-- | activerecord/lib/active_record/relation/predicate_builder.rb | 10 | ||||
-rw-r--r-- | activerecord/lib/active_record/relation/predicate_builder/array_handler.rb | 14 |
2 files changed, 16 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb index 71bb795d5b..61db27d150 100644 --- a/activerecord/lib/active_record/relation/predicate_builder.rb +++ b/activerecord/lib/active_record/relation/predicate_builder.rb @@ -17,7 +17,7 @@ module ActiveRecord register_handler(Base, BaseHandler.new) register_handler(Range, RangeHandler.new) register_handler(Relation, RelationHandler.new) - register_handler(Array, ArrayHandler.new) + register_handler(Array, ArrayHandler.new(self)) end def resolve_column_aliases(hash) @@ -93,6 +93,10 @@ module ActiveRecord @handlers.unshift([klass, handler]) end + def build(attribute, value) + handler_for(value).call(attribute, value) + end + protected attr_reader :klass, :table @@ -129,10 +133,6 @@ module ActiveRecord attributes end - def build(attribute, value) - handler_for(value).call(attribute, value) - end - def handler_for(object) @handlers.detect { |klass, _| klass === object }.last end diff --git a/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb index 58bccf2167..4b5f5773a0 100644 --- a/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb +++ b/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb @@ -3,6 +3,10 @@ require 'active_support/core_ext/string/filters' module ActiveRecord class PredicateBuilder class ArrayHandler # :nodoc: + def initialize(predicate_builder) + @predicate_builder = predicate_builder + end + def call(attribute, value) values = value.map { |x| x.is_a?(Base) ? x.id : x } nils, values = values.partition(&:nil?) @@ -14,19 +18,23 @@ module ActiveRecord values_predicate = case values.length when 0 then NullPredicate - when 1 then attribute.eq(values.first) + when 1 then predicate_builder.build(attribute, values.first) else attribute.in(values) end unless nils.empty? - values_predicate = values_predicate.or(attribute.eq(nil)) + values_predicate = values_predicate.or(predicate_builder.build(attribute, nil)) end - array_predicates = ranges.map { |range| attribute.between(range) } + array_predicates = ranges.map { |range| predicate_builder.build(attribute, range) } array_predicates.unshift(values_predicate) array_predicates.inject { |composite, predicate| composite.or(predicate) } end + protected + + attr_reader :predicate_builder + module NullPredicate # :nodoc: def self.or(other) other |