diff --git a/CHANGELOG.md b/CHANGELOG.md index 96913e3cc..658b1176b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +#### Fixed + +[#1054](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1054) Conditionally apply SQL Server monkey patches to ActiveRecord so that it is safe to use this gem alongside other database adapters (e.g. PostgreSQL) in a multi-database Rails app + ## v6.0.2 #### Fixed diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb index 1becf129b..af0e6a4e7 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb @@ -10,6 +10,8 @@ module AttributeMethods private def attributes_for_update(attribute_names) + return super unless self.class.connection.adapter_name == "SQLServer" + super.reject do |name| column = self.class.columns_hash[name] column && column.respond_to?(:is_identity?) && column.is_identity? diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb index d02e6a302..254fa3c99 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb @@ -10,6 +10,8 @@ module CoreExt module Calculations # Same as original except we don't perform PostgreSQL hack that removes ordering. def calculate(operation, column_name) + return super unless klass.connection.adapter_name == "SQLServer" + if has_include?(column_name) relation = apply_join_dependency @@ -29,6 +31,8 @@ def calculate(operation, column_name) private def build_count_subquery(relation, column_name, distinct) + return super unless klass.connection.adapter_name == "SQLServer" + super(relation.unscope(:order), column_name, distinct) end diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb index 89e1d6bb1..9a6a9a775 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb @@ -9,6 +9,8 @@ module Explain SQLSERVER_STATEMENT_REGEXP = /N'(.+)', N'(.+)', (.+)/ def exec_explain(queries) + return super unless connection.adapter_name == "SQLServer" + unprepared_queries = queries.map do |(sql, binds)| [unprepare_sqlserver_statement(sql, binds), binds] end 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 index ccfa32620..03932d492 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb @@ -12,6 +12,8 @@ module FinderMethods # Same as original except we order by values in distinct select if present. def construct_relation_for_exists(conditions) + return super unless klass.connection.adapter_name == "SQLServer" + conditions = sanitize_forbidden_attributes(conditions) if distinct_value && offset_value diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb index 0171f4c65..9d64c99e8 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb @@ -10,6 +10,8 @@ module Preloader private def records_for(ids) + return super unless klass.connection.adapter_name == "SQLServer" + ids.each_slice(in_clause_length).flat_map do |slice| scope.where(association_key_name => slice).load do |record| # Processing only the first owner