File tree Expand file tree Collapse file tree 2 files changed +18
-5
lines changed
lib/active_record/connection_adapters/postgresql/oid
test/cases/adapters/postgresql Expand file tree Collapse file tree 2 files changed +18
-5
lines changed Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ module PostgreSQL
6
6
module OID # :nodoc:
7
7
class Uuid < Type ::Value # :nodoc:
8
8
ACCEPTABLE_UUID = %r{\A (\{ )?([a-fA-F0-9]{4}-?){8}(?(1)\} |)\z }
9
+ CANONICAL_UUID = %r{\A [0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}\z }
9
10
10
11
alias :serialize :deserialize
11
12
@@ -15,18 +16,27 @@ def type
15
16
16
17
def changed? ( old_value , new_value , _new_value_before_type_cast )
17
18
old_value . class != new_value . class ||
18
- new_value && old_value . casecmp ( new_value ) != 0
19
+ new_value != old_value
19
20
end
20
21
21
22
def changed_in_place? ( raw_old_value , new_value )
22
23
raw_old_value . class != new_value . class ||
23
- new_value && raw_old_value . casecmp ( new_value ) != 0
24
+ new_value != raw_old_value
24
25
end
25
26
26
27
private
27
28
def cast_value ( value )
28
- casted = value . to_s
29
- casted if casted . match? ( ACCEPTABLE_UUID )
29
+ value = value . to_s
30
+ format_uuid ( value ) if value . match? ( ACCEPTABLE_UUID )
31
+ end
32
+
33
+ def format_uuid ( uuid )
34
+ if uuid . match? ( CANONICAL_UUID )
35
+ uuid
36
+ else
37
+ uuid = uuid . delete ( "{}-" ) . downcase
38
+ "#{ uuid [ ..7 ] } -#{ uuid [ 8 ..11 ] } -#{ uuid [ 12 ..15 ] } -#{ uuid [ 16 ..19 ] } -#{ uuid [ 20 ..] } "
39
+ end
30
40
end
31
41
end
32
42
end
Original file line number Diff line number Diff line change @@ -121,10 +121,13 @@ def test_invalid_uuid_dont_match_to_nil
121
121
assert_empty UUIDType . where ( guid : "foobar" )
122
122
end
123
123
124
- def test_uuid_change_case_does_not_mark_dirty
124
+ def test_uuid_change_format_does_not_mark_dirty
125
125
model = UUIDType . create! ( guid : "abcd-0123-4567-89ef-dead-beef-0101-1010" )
126
126
model . guid = model . guid . swapcase
127
127
assert_not_predicate model , :changed?
128
+
129
+ model . guid = "{#{ model . guid } }"
130
+ assert_not_predicate model , :changed?
128
131
end
129
132
130
133
class DuckUUID
You can’t perform that action at this time.
0 commit comments