提交 6d4a19cd 编写于 作者: S Sean Griffin

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]
上级 eac4658b
......@@ -19,7 +19,12 @@ def call(attribute, value)
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?
......
......@@ -36,7 +36,8 @@ def test_not_with_nil
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 @@ def test_not_eq_with_array_parameter
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]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册