@@ -605,6 +605,23 @@ defmodule PolymorphicEmbed do
605605 Enum . reduce ( types , map , & polymorphic_key_reducer ( & 1 , & 2 , changes , msg_func ) )
606606 end
607607
608+ defp polymorphic_key_reducer (
609+ { field , { rel , % { cardinality: :one } } } ,
610+ acc ,
611+ changes ,
612+ msg_func
613+ )
614+ when rel in [ :assoc , :embed ] do
615+ if changeset = Map . get ( changes , field ) do
616+ case traverse_errors ( changeset , msg_func ) do
617+ errors when errors == % { } -> acc
618+ errors -> Map . put ( acc , field , errors )
619+ end
620+ else
621+ acc
622+ end
623+ end
624+
608625 defp polymorphic_key_reducer (
609626 { field , { :parameterized , PolymorphicEmbed , _opts } } ,
610627 acc ,
@@ -621,6 +638,29 @@ defmodule PolymorphicEmbed do
621638 end
622639 end
623640
641+ defp polymorphic_key_reducer (
642+ { field , { rel , % { cardinality: :many } } } ,
643+ acc ,
644+ changes ,
645+ msg_func
646+ )
647+ when rel in [ :assoc , :embed ] do
648+ if changesets = Map . get ( changes , field ) do
649+ { errors , all_empty? } =
650+ Enum . map_reduce ( changesets , true , fn changeset , all_empty? ->
651+ errors = traverse_errors ( changeset , msg_func )
652+ { errors , all_empty? and errors == % { } }
653+ end )
654+
655+ case all_empty? do
656+ true -> acc
657+ false -> Map . put ( acc , field , errors )
658+ end
659+ else
660+ acc
661+ end
662+ end
663+
624664 defp polymorphic_key_reducer (
625665 { field , { :array , { :parameterized , PolymorphicEmbed , _opts } } } ,
626666 acc ,
0 commit comments