From c57ab31fd734477eaf0e4781fdfd4150d2a26de4 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Thu, 27 Feb 2020 11:34:31 +0000 Subject: [PATCH] Order by selected items when using distinct exists --- .../sqlserver/core_ext/finder_methods.rb | 43 +++++++++++++++++++ .../connection_adapters/sqlserver_adapter.rb | 1 + 2 files changed, 44 insertions(+) create mode 100644 lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb new file mode 100644 index 000000000..fc9ff9db3 --- /dev/null +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb @@ -0,0 +1,43 @@ +require 'active_record/relation' +require 'active_record/version' + +module ActiveRecord + module ConnectionAdapters + module SQLServer + module CoreExt + module FinderMethods + + private + + # Same as original except we order by values in distinct select if present. + def construct_relation_for_exists(conditions) + if distinct_value && offset_value + relation = limit!(1) + + if select_values.present? + relation = relation.order(*select_values) + else + relation = relation.except(:order) + end + else + relation = except(:select, :distinct, :order)._select!(::ActiveRecord::FinderMethods::ONE_AS_ONE).limit!(1) + end + + case conditions + when Array, Hash + relation.where!(conditions) unless conditions.empty? + else + relation.where!(primary_key => conditions) unless conditions == :none + end + + relation + end + end + end + end + end +end + +ActiveSupport.on_load(:active_record) do + ActiveRecord::Relation.include(ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::FinderMethods) +end diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index b3f745ac6..cc8564320 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -7,6 +7,7 @@ require 'active_record/connection_adapters/sqlserver/core_ext/explain' require 'active_record/connection_adapters/sqlserver/core_ext/explain_subscriber' require 'active_record/connection_adapters/sqlserver/core_ext/attribute_methods' +require 'active_record/connection_adapters/sqlserver/core_ext/finder_methods' require 'active_record/connection_adapters/sqlserver/version' require 'active_record/connection_adapters/sqlserver/type' require 'active_record/connection_adapters/sqlserver/database_limits'