@@ -30,10 +30,42 @@ def visit_Arel_Nodes_Concat(o, collector)
3030 end
3131
3232 def visit_Arel_Nodes_UpdateStatement ( o , collector )
33- if o . orders . any? && o . limit . nil?
34- o . limit = Nodes ::Limit . new ( 9_223_372_036_854_775_807 )
33+ if has_join_and_composite_primary_key? ( o )
34+ update_statement_using_join ( o , collector )
35+ else
36+ o . limit = Nodes ::Limit . new ( 9_223_372_036_854_775_807 ) if o . orders . any? && o . limit . nil?
37+
38+ super
3539 end
36- super
40+ end
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 << "DELETE "
56+ visit o . relation . left , collector
57+ collector << " FROM "
58+ visit o . relation , collector
59+ collect_nodes_for o . wheres , collector , " WHERE " , " AND "
60+ end
61+
62+ def update_statement_using_join ( o , collector )
63+ collector << "UPDATE "
64+ visit o . relation . left , collector
65+ collect_nodes_for o . values , collector , " SET "
66+ collector << " FROM "
67+ visit o . relation , collector
68+ collect_nodes_for o . wheres , collector , " WHERE " , " AND "
3769 end
3870
3971 def visit_Arel_Nodes_Lock ( o , collector )
0 commit comments