Module: Activerecord::Multirange

Defined in:
lib/activerecord-multirange.rb,
lib/activerecord-multirange/adapter.rb,
lib/activerecord-multirange/quoting.rb,
lib/activerecord-multirange/version.rb,
lib/activerecord-multirange/relation.rb,
lib/activerecord-multirange/type_map.rb,
lib/activerecord-multirange/oid/multi_range.rb,
lib/activerecord-multirange/table_definition.rb,
lib/activerecord-multirange/schema_statements.rb

Defined Under Namespace

Modules: Adapter, OID, Quoting, Relation, SchemaStatements, TableDefinition, TypeMap Classes: Error

Constant Summary collapse

MULTIRANGE_TYPES =

Multirange types that need to be registered

{
  tsmultirange: {
    name: 'tsmultirange'
  },
  datemultirange: {
    name: 'datemultirange'
  },
  tstzmultirange: {
    name: 'tstzmultirange'
  },
  nummultirange: {
    name: 'nummultirange'
  },
  int8multirange: {
    name: 'int8multirange'
  },
  int4multirange: {
    name: 'int4multirange'
  }
}.freeze
VERSION =
'1.3.1'

Class Method Summary collapse

Class Method Details

.add_multirange_column_typeObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/activerecord-multirange.rb', line 39

def self.add_multirange_column_type
  ActiveSupport.on_load(:active_record) do
    # Register multirange types in NATIVE_DATABASE_TYPES for Rails 8 compatibility
    Activerecord::Multirange.register_native_database_types

    # Register multirange modifier for ActiveRecord attribute API
    ActiveRecord::Type.add_modifier(
      { multirange: true },
      Activerecord::Multirange::OID::MultiRange,
      adapter: :postgresql
    )

    ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Adapter)
    ActiveRecord::ConnectionAdapters::PostgreSQL::OID::TypeMapInitializer
      .prepend(TypeMap)
    ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting.prepend(Quoting)
    ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements.prepend(
      SchemaStatements
    )
    ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.prepend(
      TableDefinition
    )
    ActiveRecord::Relation.prepend(Relation)
  end
end

.register_native_database_typesObject



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/activerecord-multirange.rb', line 65

def self.register_native_database_types
  # Ensure the PostgreSQL adapter is loaded
  unless defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
    return
  end

  adapter_class = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

  # Check if NATIVE_DATABASE_TYPES is already defined and modifiable
  if adapter_class.const_defined?(:NATIVE_DATABASE_TYPES)
    current_types = adapter_class::NATIVE_DATABASE_TYPES

    # Only modify if our types aren't already registered
    unless current_types.key?(:tsmultirange)
      # Create a new hash with existing types plus our multirange types
      new_types = current_types.merge(MULTIRANGE_TYPES)

      # Replace the constant with the updated hash
      adapter_class.send(:remove_const, :NATIVE_DATABASE_TYPES)
      adapter_class.const_set(:NATIVE_DATABASE_TYPES, new_types.freeze)
    end
  end
end