aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
diff options
context:
space:
mode:
authorRafael França <rafaelmfranca@gmail.com>2019-01-17 18:32:27 -0500
committerGitHub <noreply@github.com>2019-01-17 18:32:27 -0500
commit41dc4d94907914ad8e75444bd3e0ea0a598bfea1 (patch)
tree1d5939d3c49731bda06ec218f0903a56b2fc79a4 /activerecord/lib/active_record
parent9aa08151924fa6ff1f1c49e987b67012c295c9cc (diff)
parent9905cdc9465c482e193950e2f672c6c6c2e6ded1 (diff)
downloadrails-41dc4d94907914ad8e75444bd3e0ea0a598bfea1.tar.gz
rails-41dc4d94907914ad8e75444bd3e0ea0a598bfea1.tar.bz2
rails-41dc4d94907914ad8e75444bd3e0ea0a598bfea1.zip
Merge pull request #34963 from dylanahsmith/better-composed-of-single-field-query
activerecord: Use a simpler query condition for aggregates with one mapping
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder.rb20
1 files changed, 12 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb
index b59ff912fe..a0f6ada3ff 100644
--- a/activerecord/lib/active_record/relation/predicate_builder.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder.rb
@@ -90,16 +90,20 @@ module ActiveRecord
queries.reduce(&:or)
elsif table.aggregated_with?(key)
mapping = table.reflect_on_aggregation(key).mapping
- queries = Array.wrap(value).map do |object|
- mapping.map do |field_attr, aggregate_attr|
- if mapping.size == 1 && !object.respond_to?(aggregate_attr)
- build(table.arel_attribute(field_attr), object)
- else
+ if mapping.length == 1
+ column_name, aggr_attr = mapping.first
+ values = Array.wrap(value).map do |object|
+ object.respond_to?(aggr_attr) ? object.public_send(aggr_attr) : object
+ end
+ build(table.arel_attribute(column_name), values)
+ else
+ queries = Array.wrap(value).map do |object|
+ mapping.map do |field_attr, aggregate_attr|
build(table.arel_attribute(field_attr), object.send(aggregate_attr))
- end
- end.reduce(&:and)
+ end.reduce(&:and)
+ end
+ queries.reduce(&:or)
end
- queries.reduce(&:or)
else
build(table.arel_attribute(key), value)
end