@@ -30,20 +30,40 @@ def visit_Arel_Nodes_Concat(o, collector)
30
30
end
31
31
32
32
def visit_Arel_Nodes_UpdateStatement ( o , collector )
33
- if has_join_sources ?( o ) && o . relation . left . instance_variable_get ( :@klass ) . composite_primary_key?
33
+ if has_join_and_composite_primary_key ?( o )
34
34
update_statement_using_join ( o , collector )
35
35
else
36
- if o . orders . any? && o . limit . nil?
37
- o . limit = Nodes ::Limit . new ( 9_223_372_036_854_775_807 )
38
- end
36
+ o . limit = Nodes ::Limit . new ( 9_223_372_036_854_775_807 ) if o . orders . any? && o . limit . nil?
39
37
40
38
super
41
39
end
42
40
end
43
41
42
+ def visit_Arel_Nodes_DeleteStatement ( o , collector )
43
+ if has_join_and_composite_primary_key? ( o )
44
+ delete_statement_using_join ( o , collector )
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ def has_join_and_composite_primary_key? ( o )
51
+ has_join_sources? ( o ) && o . relation . left . instance_variable_get ( :@klass ) . composite_primary_key?
52
+ end
53
+
54
+ def delete_statement_using_join ( o , collector )
55
+ collector . retryable = false
56
+
57
+ collector << "DELETE "
58
+ visit o . relation . left , collector
59
+ collector << " FROM "
60
+ visit o . relation , collector
61
+ collect_nodes_for o . wheres , collector , " WHERE " , " AND "
62
+ end
63
+
44
64
def update_statement_using_join ( o , collector )
45
65
collector . retryable = false
46
-
66
+
47
67
collector << "UPDATE "
48
68
visit o . relation . left , collector
49
69
collect_nodes_for o . values , collector , " SET "
0 commit comments