activerecord-multirange 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 713159095b3f14f7031bd8488b32d8f9880fa7870437b034d66c87eaaf23e24c
|
4
|
+
data.tar.gz: 0d2f435fe0dd5b5d0959100fdccce2c6ca207f28c570c781c190353b373c623f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4690a5657d8f0c82c4a2b4e7c91efc7976a04579804c1f53af3be935340df5e4ad7229502427f0084adfd8abbb73a0ca436b6741a4a98af149e4531fba0b9b08
|
7
|
+
data.tar.gz: 125885f599acd13e58e35258cbefee3bcde4d3b8a766f0668a7583e80ea0b7b6c37ee7ba7bd6da9331211724decac14b1e0195efa26f92103c9513eff3428fbb
|
data/Gemfile.lock
CHANGED
@@ -20,20 +20,18 @@ module Activerecord
|
|
20
20
|
# Query for multirange types and their corresponding base types (not range types)
|
21
21
|
# We need to get the range's subtype (e.g., date) not the range type itself
|
22
22
|
query = <<-QUERY.squish
|
23
|
-
SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput
|
23
|
+
SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput,
|
24
24
|
pr.rngsubtype, m.typtype, m.typbasetype
|
25
|
-
FROM pg_type m
|
26
|
-
JOIN
|
27
|
-
JOIN pg_range pr ON r.oid = pr.rngtypid
|
25
|
+
FROM pg_type m
|
26
|
+
JOIN pg_range pr ON m.oid = pr.rngmultitypid
|
28
27
|
WHERE m.typtype = 'm';
|
29
28
|
QUERY
|
30
29
|
|
31
30
|
# Use exec_query for all Rails versions since execute_and_clear is private
|
32
31
|
result = exec_query(query, 'SCHEMA', [])
|
32
|
+
|
33
33
|
# Convert rows to hash format with column names as keys
|
34
|
-
records = result.rows.map
|
35
|
-
result.columns.zip(row).to_h
|
36
|
-
end
|
34
|
+
records = result.rows.map { |row| result.columns.zip(row).to_h }
|
37
35
|
initializer.register_multirange_type(records)
|
38
36
|
end
|
39
37
|
end
|
@@ -35,7 +35,9 @@ module Activerecord
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def cast_value(value)
|
38
|
-
return nil if value.
|
38
|
+
return nil if value.nil?
|
39
|
+
return [] if value.is_a?(::Array) && value.empty?
|
40
|
+
return value if value.is_a?(::Array)
|
39
41
|
return value unless value.is_a?(::String)
|
40
42
|
|
41
43
|
ranges = scan_ranges(value)
|
@@ -16,12 +16,24 @@ module Activerecord
|
|
16
16
|
|
17
17
|
# Multirange types that need to be registered
|
18
18
|
MULTIRANGE_TYPES = {
|
19
|
-
tsmultirange: {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
tsmultirange: {
|
20
|
+
name: 'tsmultirange'
|
21
|
+
},
|
22
|
+
datemultirange: {
|
23
|
+
name: 'datemultirange'
|
24
|
+
},
|
25
|
+
tstzmultirange: {
|
26
|
+
name: 'tstzmultirange'
|
27
|
+
},
|
28
|
+
nummultirange: {
|
29
|
+
name: 'nummultirange'
|
30
|
+
},
|
31
|
+
int8multirange: {
|
32
|
+
name: 'int8multirange'
|
33
|
+
},
|
34
|
+
int4multirange: {
|
35
|
+
name: 'int4multirange'
|
36
|
+
}
|
25
37
|
}.freeze
|
26
38
|
|
27
39
|
def self.add_multirange_column_type
|
@@ -29,6 +41,13 @@ module Activerecord
|
|
29
41
|
# Register multirange types in NATIVE_DATABASE_TYPES for Rails 8 compatibility
|
30
42
|
Activerecord::Multirange.register_native_database_types
|
31
43
|
|
44
|
+
# Register multirange modifier for ActiveRecord attribute API
|
45
|
+
ActiveRecord::Type.add_modifier(
|
46
|
+
{ multirange: true },
|
47
|
+
Activerecord::Multirange::OID::MultiRange,
|
48
|
+
adapter: :postgresql
|
49
|
+
)
|
50
|
+
|
32
51
|
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Adapter)
|
33
52
|
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::TypeMapInitializer
|
34
53
|
.prepend(TypeMap)
|
@@ -45,19 +64,21 @@ module Activerecord
|
|
45
64
|
|
46
65
|
def self.register_native_database_types
|
47
66
|
# Ensure the PostgreSQL adapter is loaded
|
48
|
-
|
67
|
+
unless defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
68
|
+
return
|
69
|
+
end
|
49
70
|
|
50
71
|
adapter_class = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
|
51
72
|
|
52
73
|
# Check if NATIVE_DATABASE_TYPES is already defined and modifiable
|
53
74
|
if adapter_class.const_defined?(:NATIVE_DATABASE_TYPES)
|
54
75
|
current_types = adapter_class::NATIVE_DATABASE_TYPES
|
55
|
-
|
76
|
+
|
56
77
|
# Only modify if our types aren't already registered
|
57
78
|
unless current_types.key?(:tsmultirange)
|
58
79
|
# Create a new hash with existing types plus our multirange types
|
59
80
|
new_types = current_types.merge(MULTIRANGE_TYPES)
|
60
|
-
|
81
|
+
|
61
82
|
# Replace the constant with the updated hash
|
62
83
|
adapter_class.send(:remove_const, :NATIVE_DATABASE_TYPES)
|
63
84
|
adapter_class.const_set(:NATIVE_DATABASE_TYPES, new_types.freeze)
|