diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-10-24 10:31:41 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2018-10-24 11:26:49 +0900 |
commit | ce40073c9c321575e6b4f46dd5ac9b796a2637be (patch) | |
tree | 0e57b4f8c46ff591122cec58d248fe39125e3bbf /activerecord/lib | |
parent | dc6761592009e9146552fc9d6299bf58a34e187a (diff) | |
download | rails-ce40073c9c321575e6b4f46dd5ac9b796a2637be.tar.gz rails-ce40073c9c321575e6b4f46dd5ac9b796a2637be.tar.bz2 rails-ce40073c9c321575e6b4f46dd5ac9b796a2637be.zip |
Lazy checking whether or not values in IN clause are boundable
Since #33844, eager loading/preloading with too many and/or too large
ids won't be broken by pre-checking whether the value is constructable
or not.
But the pre-checking caused the type to be evaluated at relation build
time instead of at the query execution time, that is breaking an
expectation for some apps.
I've made the pre-cheking lazy as much as possible, that is no longer
happend at relation build time.
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb | 11 | ||||
-rw-r--r-- | activerecord/lib/active_record/relation/predicate_builder/array_handler.rb | 5 |
2 files changed, 12 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb b/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb index 3dcb916d99..f158946c6d 100644 --- a/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +++ b/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb @@ -10,8 +10,17 @@ module ActiveRecord super end - def visit_Arel_Nodes_In(*) + def visit_Arel_Nodes_In(o, collector) @preparable = false + + if Array === o.right && !o.right.empty? + o.right.delete_if do |bind| + if Arel::Nodes::BindParam === bind && Relation::QueryAttribute === bind.value + !bind.value.boundable? + end + end + end + super 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 fadb3c420d..ee2ece1560 100644 --- a/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb +++ b/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb @@ -22,9 +22,8 @@ module ActiveRecord when 1 then predicate_builder.build(attribute, values.first) else values.map! do |v| - bind = predicate_builder.build_bind_attribute(attribute.name, v) - bind if bind.value.boundable? - end.compact! + predicate_builder.build_bind_attribute(attribute.name, v) + end values.empty? ? NullPredicate : attribute.in(values) end |