diff --git a/lib/active_record/connection_adapters/sqlserver/quoting.rb b/lib/active_record/connection_adapters/sqlserver/quoting.rb index f8d335eb0..09d8226bc 100644 --- a/lib/active_record/connection_adapters/sqlserver/quoting.rb +++ b/lib/active_record/connection_adapters/sqlserver/quoting.rb @@ -10,14 +10,14 @@ module Quoting def fetch_type_metadata(sql_type, sqlserver_options = {}) cast_type = lookup_cast_type(sql_type) - SQLServer::SqlTypeMetadata.new( + simple_type = SqlTypeMetadata.new( sql_type: sql_type, type: cast_type.type, limit: cast_type.limit, precision: cast_type.precision, - scale: cast_type.scale, - sqlserver_options: sqlserver_options + scale: cast_type.scale ) + SQLServer::TypeMetadata.new(simple_type, sqlserver_options: sqlserver_options) end def quote_string(s) diff --git a/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb b/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb index 40f77714c..ebcacc5cd 100644 --- a/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +++ b/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb @@ -3,16 +3,36 @@ module ActiveRecord module ConnectionAdapters module SQLServer - class SqlTypeMetadata < ActiveRecord::ConnectionAdapters::SqlTypeMetadata - def initialize(**kwargs) - @sqlserver_options = kwargs.extract!(:sqlserver_options) - super(**kwargs) + class TypeMetadata < DelegateClass(SqlTypeMetadata) + undef to_yaml if method_defined?(:to_yaml) + + include Deduplicable + + attr_reader :sqlserver_options + + def initialize(type_metadata, sqlserver_options: nil) + super(type_metadata) + @sqlserver_options = sqlserver_options + end + + def ==(other) + other.is_a?(TypeMetadata) && + __getobj__ == other.__getobj__ && + sqlserver_options == other.sqlserver_options + end + alias eql? == + + def hash + TypeMetadata.hash ^ + __getobj__.hash ^ + sqlserver_options.hash end - protected + private - def attributes_for_hash - super + [@sqlserver_options] + def deduplicated + __setobj__(__getobj__.deduplicate) + super end end end