From 6d4a19cd503b39bdbefae7c1c527b24ad2e3a36a Mon Sep 17 00:00:00 2001 From: Sean Griffin Date: Fri, 26 Dec 2014 15:55:06 -0700 Subject: Eagerly cast array values passed to the predicate builder Part of a larger refactoring to remove type casting from Arel. /cc @mrgilman [Sean Griffin & Melanie Gilman] --- .../lib/active_record/relation/predicate_builder/array_handler.rb | 7 ++++++- activerecord/test/cases/relation/where_chain_test.rb | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'activerecord') 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 4b5f5773a0..7c90563d96 100644 --- a/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb +++ b/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb @@ -19,7 +19,12 @@ module ActiveRecord case values.length when 0 then NullPredicate when 1 then predicate_builder.build(attribute, values.first) - else attribute.in(values) + else + attribute_name = attribute.name + casted_values = values.map do |v| + predicate_builder.type_cast_for_database(attribute_name, v) + end + attribute.in(casted_values) end unless nils.empty? diff --git a/activerecord/test/cases/relation/where_chain_test.rb b/activerecord/test/cases/relation/where_chain_test.rb index 3a02e8230d..f9d3badceb 100644 --- a/activerecord/test/cases/relation/where_chain_test.rb +++ b/activerecord/test/cases/relation/where_chain_test.rb @@ -36,7 +36,8 @@ module ActiveRecord end def test_not_in - expected = Post.arel_table[@name].not_in(%w[hello goodbye]) + values = %w[hello goodbye].map { |v| Arel::Nodes::Quoted.new(v) } + expected = Post.arel_table[@name].not_in(values) relation = Post.where.not(title: %w[hello goodbye]) assert_equal([expected], relation.where_values) end @@ -90,7 +91,10 @@ module ActiveRecord def test_chaining_multiple relation = Post.where.not(author_id: [1, 2]).where.not(title: 'ruby on rails') - expected = Post.arel_table['author_id'].not_in([1, 2]) + expected = Post.arel_table['author_id'].not_in([ + Arel::Nodes::Quoted.new(1), + Arel::Nodes::Quoted.new(2), + ]) assert_equal(expected, relation.where_values[0]) value = relation.where_values[1] -- cgit v1.2.3