@@ -31,11 +31,11 @@ class UniqueValidationWithoutIndex < Base
31
31
RESTRICT_ON_SEND = %i[ validates ] . freeze
32
32
33
33
def on_send ( node )
34
- return if uniqueness_part ( node ) &.falsey_literal?
35
- return if condition_part? ( node )
36
34
return unless schema
35
+ return unless ( uniqueness_part = uniqueness_part ( node ) )
36
+ return if uniqueness_part . falsey_literal? || condition_part? ( node , uniqueness_part )
37
37
38
- klass , table , names = find_schema_information ( node )
38
+ klass , table , names = find_schema_information ( node , uniqueness_part )
39
39
return unless names
40
40
return if with_index? ( klass , table , names )
41
41
@@ -44,12 +44,12 @@ def on_send(node)
44
44
45
45
private
46
46
47
- def find_schema_information ( node )
47
+ def find_schema_information ( node , uniqueness_part )
48
48
klass = class_node ( node )
49
49
return unless klass
50
50
51
51
table = schema . table_by ( name : table_name ( klass ) )
52
- names = column_names ( node )
52
+ names = column_names ( node , uniqueness_part )
53
53
54
54
[ klass , table , names ]
55
55
end
@@ -71,12 +71,12 @@ def include_column_names_in_expression_index?(index, column_names)
71
71
end
72
72
end
73
73
74
- def column_names ( node )
74
+ def column_names ( node , uniqueness_part )
75
75
arg = node . first_argument
76
76
return unless arg . str_type? || arg . sym_type?
77
77
78
78
ret = [ arg . value ]
79
- names_from_scope = column_names_from_scope ( node )
79
+ names_from_scope = column_names_from_scope ( uniqueness_part )
80
80
ret . concat ( names_from_scope ) if names_from_scope
81
81
82
82
ret = ret . flat_map do |name |
@@ -90,11 +90,10 @@ def column_names(node)
90
90
ret . include? ( nil ) ? nil : ret . to_set
91
91
end
92
92
93
- def column_names_from_scope ( node )
94
- uniq = uniqueness_part ( node )
95
- return unless uniq . hash_type?
93
+ def column_names_from_scope ( uniqueness_part )
94
+ return unless uniqueness_part . hash_type?
96
95
97
- scope = find_scope ( uniq )
96
+ scope = find_scope ( uniqueness_part )
98
97
return unless scope
99
98
100
99
scope = unfreeze_scope ( scope )
@@ -135,14 +134,11 @@ def uniqueness_part(node)
135
134
end
136
135
end
137
136
138
- def condition_part? ( node )
139
- pairs = node . arguments . last
140
- return unless pairs . hash_type?
141
-
137
+ def condition_part? ( node , uniqueness_node )
138
+ pairs = node . last_argument
139
+ return false unless pairs . hash_type?
142
140
return true if condition_hash_part? ( pairs , keys : %i[ if unless ] )
143
-
144
- uniqueness_node = uniqueness_part ( node )
145
- return unless uniqueness_node &.hash_type?
141
+ return false unless uniqueness_node . hash_type?
146
142
147
143
condition_hash_part? ( uniqueness_node , keys : %i[ if unless conditions ] )
148
144
end
0 commit comments