From f79d55a4cca155171c6d16c3c07834ba43d572c2 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Sun, 7 Aug 2016 00:41:24 +0900 Subject: `where` by `array|range` attribute with array or range value Currently predicate builder cannot build a predicate for `array|range` attribute. This commit fixes the issue. Related #25671. --- .../lib/active_record/relation/predicate_builder.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'activerecord/lib/active_record/relation') diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb index 505a78cb78..9d6fc9f702 100644 --- a/activerecord/lib/active_record/relation/predicate_builder.rb +++ b/activerecord/lib/active_record/relation/predicate_builder.rb @@ -87,14 +87,14 @@ module ActiveRecord binds = [] attributes.each do |column_name, value| - case value - when Hash + case + when value.is_a?(Hash) attrs, bvs = associated_predicate_builder(column_name).create_binds_for_hash(value) result[column_name] = attrs binds += bvs - when Relation + when value.is_a?(Relation) binds += value.bound_attributes - when Range + when value.is_a?(Range) && !table.type(column_name).respond_to?(:subtype) first = value.begin last = value.end unless first.respond_to?(:infinite?) && first.infinite? @@ -155,9 +155,13 @@ module ActiveRecord end def can_be_bound?(column_name, value) - !value.nil? && - handler_for(value).is_a?(BasicObjectHandler) && - !table.associated_with?(column_name) + return if table.associated_with?(column_name) + case value + when Array, Range + table.type(column_name).respond_to?(:subtype) + else + !value.nil? && handler_for(value).is_a?(BasicObjectHandler) + end end def build_bind_param(column_name, value) -- cgit v1.2.3