diff --git a/config/initializers/sqlite_schema_dumper.rb b/config/initializers/sqlite_schema_dumper.rb index b3d76b186..782c0b6b2 100644 --- a/config/initializers/sqlite_schema_dumper.rb +++ b/config/initializers/sqlite_schema_dumper.rb @@ -17,8 +17,6 @@ module SQLiteFTS5SchemaDumperFix end end -ActiveSupport.on_load(:active_record) do - if defined?(ActiveRecord::ConnectionAdapters::SQLite3::SchemaDumper) - ActiveRecord::ConnectionAdapters::SQLite3::SchemaDumper.prepend(SQLiteFTS5SchemaDumperFix) - end +ActiveSupport.on_load(:active_record_sqlite3adapter) do + ActiveRecord::ConnectionAdapters::SQLite3::SchemaDumper.prepend(SQLiteFTS5SchemaDumperFix) end diff --git a/config/initializers/table_definition_column_limits.rb b/config/initializers/table_definition_column_limits.rb index 77dd1ded2..ff01c5e3a 100644 --- a/config/initializers/table_definition_column_limits.rb +++ b/config/initializers/table_definition_column_limits.rb @@ -39,10 +39,6 @@ module TableDefinitionColumnLimits end end -ActiveSupport.on_load(:active_record) do - ActiveRecord::ConnectionAdapters::TableDefinition.prepend(TableDefinitionColumnLimits) -end - # For SQLite: append inline CHECK constraints to enforce string/text length limits. # since SQLite doesn't natively enforce VARCHAR/TEXT length limits. module SQLiteColumnLimitCheckConstraints @@ -65,6 +61,10 @@ module SQLiteColumnLimitCheckConstraints end end +ActiveSupport.on_load(:active_record) do + ActiveRecord::ConnectionAdapters::TableDefinition.prepend(TableDefinitionColumnLimits) +end + ActiveSupport.on_load(:active_record_sqlite3adapter) do ActiveRecord::ConnectionAdapters::SQLite3::SchemaCreation.prepend(SQLiteColumnLimitCheckConstraints) end diff --git a/config/initializers/uuid_primary_keys.rb b/config/initializers/uuid_primary_keys.rb index 698da184f..56ff7f3af 100644 --- a/config/initializers/uuid_primary_keys.rb +++ b/config/initializers/uuid_primary_keys.rb @@ -1,95 +1,83 @@ # Automatically use UUID type for all binary(16) columns -ActiveSupport.on_load(:active_record) do - module MysqlUuidAdapter - # Add UUID to MySQL's native database types +module MysqlUuidAdapter + extend ActiveSupport::Concern + + # Override lookup_cast_type to recognize binary(16) as UUID type + def lookup_cast_type(sql_type) + if sql_type == "binary(16)" + ActiveRecord::Type.lookup(:uuid, adapter: :trilogy) + else + super + end + end + + class_methods do def native_database_types @native_database_types_with_uuid ||= super.merge(uuid: { name: "binary", limit: 16 }) end + end +end - # Override lookup_cast_type to recognize binary(16) as UUID type - def lookup_cast_type(sql_type) - if sql_type == "binary(16)" - ActiveRecord::Type.lookup(:uuid, adapter: :trilogy) - else - super - end +module SqliteUuidAdapter + extend ActiveSupport::Concern + + # Override lookup_cast_type to recognize BLOB as UUID type + def lookup_cast_type(sql_type) + if sql_type == "blob(16)" + ActiveRecord::Type.lookup(:uuid, adapter: :sqlite3) + else + super end end - if defined?(ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter) - ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.prepend(MysqlUuidAdapter) + # Override fetch_type_metadata to preserve UUID type and limit + def fetch_type_metadata(sql_type) + if sql_type == "blob(16)" + ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new( + sql_type: sql_type, + type: :uuid, + limit: 16 + ) + else + super + end end - module SqliteUuidAdapter + class_methods do def native_database_types @native_database_types_with_uuid ||= super.merge(uuid: { name: "blob", limit: 16 }) end + end +end - # Override lookup_cast_type to recognize BLOB as UUID type - def lookup_cast_type(sql_type) - if sql_type == "blob(16)" - ActiveRecord::Type.lookup(:uuid, adapter: :sqlite3) - else - super - end - end - - # Override fetch_type_metadata to preserve UUID type and limit - def fetch_type_metadata(sql_type) - if sql_type == "blob(16)" - ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new( - sql_type: sql_type, - type: :uuid, - limit: 16 - ) - else - super - end +module SchemaDumperUuidType + # Map binary(16) and blob(16) columns to :uuid type in schema.rb + def schema_type(column) + if column.sql_type == "binary(16)" || column.sql_type == "blob(16)" + :uuid + else + super end end +end - if defined?(ActiveRecord::ConnectionAdapters::SQLite3Adapter) - ActiveRecord::ConnectionAdapters::SQLite3Adapter.prepend(SqliteUuidAdapter) - - # Also add UUID to class-level native_database_types - ActiveRecord::ConnectionAdapters::SQLite3Adapter.class_eval do - @native_database_types = nil # Clear cache - - class << self - alias_method :original_native_database_types, :native_database_types - - def native_database_types - @native_database_types_with_uuid ||= original_native_database_types.merge(uuid: { name: "blob", limit: 16 }) - end - end - end - end - - module SchemaDumperUuidType - # Map binary(16) and blob(16) columns to :uuid type in schema.rb - def schema_type(column) - if column.sql_type == "binary(16)" || column.sql_type == "blob(16)" - :uuid - else - super - end - end - end - - if defined?(ActiveRecord::ConnectionAdapters::MySQL::SchemaDumper) - ActiveRecord::ConnectionAdapters::MySQL::SchemaDumper.prepend(SchemaDumperUuidType) - end - - if defined?(ActiveRecord::ConnectionAdapters::SQLite3::SchemaDumper) - ActiveRecord::ConnectionAdapters::SQLite3::SchemaDumper.prepend(SchemaDumperUuidType) - end - - module TableDefinitionUuidSupport - def uuid(name, **options) - column(name, :uuid, **options) - end +module TableDefinitionUuidSupport + def uuid(name, **options) + column(name, :uuid, **options) end +end +ActiveSupport.on_load(:active_record) do ActiveRecord::ConnectionAdapters::TableDefinition.prepend(TableDefinitionUuidSupport) end + +ActiveSupport.on_load(:active_record_trilogyadapter) do + ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.prepend(MysqlUuidAdapter) + ActiveRecord::ConnectionAdapters::MySQL::SchemaDumper.prepend(SchemaDumperUuidType) +end + +ActiveSupport.on_load(:active_record_sqlite3adapter) do + ActiveRecord::ConnectionAdapters::SQLite3Adapter.prepend(SqliteUuidAdapter) + ActiveRecord::ConnectionAdapters::SQLite3::SchemaDumper.prepend(SchemaDumperUuidType) +end