diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-02-27 01:02:53 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2019-02-27 01:04:20 +0900 |
commit | 350ad01b815979f492f5f359991c9be707d5e3b5 (patch) | |
tree | ba0ecc13313d7b97674c7ba8e3d819db361615b3 /activerecord/lib | |
parent | 588f97d76fabdf46211150f991c58d48e9fbf0ac (diff) | |
parent | fa2c61fc636f958c274692f2a0f3062859797790 (diff) | |
download | rails-350ad01b815979f492f5f359991c9be707d5e3b5.tar.gz rails-350ad01b815979f492f5f359991c9be707d5e3b5.tar.bz2 rails-350ad01b815979f492f5f359991c9be707d5e3b5.zip |
Merge pull request #35361 from jvillarejo/fix_wrong_size_query_with_distinct_select
Fix different `count` calculation when using `size` with DISTINCT `select`
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/relation/calculations.rb | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb index bdd3c540bb..4f9ddf302e 100644 --- a/activerecord/lib/active_record/relation/calculations.rb +++ b/activerecord/lib/active_record/relation/calculations.rb @@ -221,7 +221,6 @@ module ActiveRecord end private - def has_include?(column_name) eager_loading? || (includes_values.present? && column_name && column_name != :all) end @@ -236,10 +235,12 @@ module ActiveRecord if operation == "count" column_name ||= select_for_count if column_name == :all - if distinct && (group_values.any? || select_values.empty? && order_values.empty?) + if !distinct + distinct = distinct_select?(select_for_count) if group_values.empty? + elsif group_values.any? || select_values.empty? && order_values.empty? column_name = primary_key end - elsif column_name.is_a?(::String) && /\bDISTINCT[\s(]/i.match?(column_name) + elsif distinct_select?(column_name) distinct = nil end end @@ -251,6 +252,10 @@ module ActiveRecord end end + def distinct_select?(column_name) + column_name.is_a?(::String) && /\bDISTINCT[\s(]/i.match?(column_name) + end + def aggregate_column(column_name) return column_name if Arel::Expressions === column_name |