Skip to content

Commit e294a94

Browse files
authored
Apply monkey patches for SQL Server connections only (#933)
Recent versions of Rails support multiple database connections within the same app. It is possible for these connections to use different adapters. For example, one adapter may use SQL Server, and another uses PostgreSQL. This gem applies some monkey patches to ActiveRecord for SQL Server compatibility. These patches could break other adapters, though, in a multiple-database scenario. This commit modifies the patches so that they are applied only if the connection is SQL Server. If not, the original ActiveRecord implementation (`super`) is used instead. Fixes #929
1 parent 524b2c0 commit e294a94

File tree

6 files changed

+26
-0
lines changed

6 files changed

+26
-0
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
## Unreleased
2+
3+
#### Fixed
4+
5+
- [#933](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/933) 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
6+
7+
#### Changed
8+
9+
- ...
10+
11+
#### Added
12+
13+
- ...
14+
115
## v6.1.0.0
216

317
- No changes

lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ module AttributeMethods
1010
private
1111

1212
def attributes_for_update(attribute_names)
13+
return super unless self.class.connection.adapter_name == "SQLServer"
14+
1315
super.reject do |name|
1416
column = self.class.columns_hash[name]
1517
column && column.respond_to?(:is_identity?) && column.is_identity?

lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ module CoreExt
1010
module Calculations
1111
# Same as original except we don't perform PostgreSQL hack that removes ordering.
1212
def calculate(operation, column_name)
13+
return super unless klass.connection.adapter_name == "SQLServer"
14+
1315
if has_include?(column_name)
1416
relation = apply_join_dependency
1517

@@ -29,6 +31,8 @@ def calculate(operation, column_name)
2931
private
3032

3133
def build_count_subquery(relation, column_name, distinct)
34+
return super unless klass.connection.adapter_name == "SQLServer"
35+
3236
super(relation.unscope(:order), column_name, distinct)
3337
end
3438
end

lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module Explain
99
SQLSERVER_STATEMENT_REGEXP = /N'(.+)', N'(.+)', (.+)/
1010

1111
def exec_explain(queries)
12+
return super unless connection.adapter_name == "SQLServer"
13+
1214
unprepared_queries = queries.map do |(sql, binds)|
1315
[unprepare_sqlserver_statement(sql, binds), binds]
1416
end

lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ module FinderMethods
1212

1313
# Same as original except we order by values in distinct select if present.
1414
def construct_relation_for_exists(conditions)
15+
return super unless klass.connection.adapter_name == "SQLServer"
16+
1517
conditions = sanitize_forbidden_attributes(conditions)
1618

1719
if distinct_value && offset_value

lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ module Preloader
1010
private
1111

1212
def records_for(ids)
13+
return super unless klass.connection.adapter_name == "SQLServer"
14+
1315
ids.each_slice(in_clause_length).flat_map do |slice|
1416
scope.where(association_key_name => slice).load do |record|
1517
# Processing only the first owner

0 commit comments

Comments
 (0)