@@ -28,6 +28,7 @@ defmodule Ecto.Embedded do
2828 :owner ,
2929 :related ,
3030 :on_cast ,
31+ virtual: false ,
3132 on_replace: :raise ,
3233 unique: true ,
3334 ordered: true
@@ -149,7 +150,11 @@ defmodule Ecto.Embedded do
149150 @ doc false
150151 def prepare ( changeset , embeds , adapter , repo_action ) do
151152 % { changes: changes , types: types , repo: repo } = changeset
152- prepare ( Map . take ( changes , embeds ) , types , adapter , repo , repo_action )
153+ #non_virtual_embeds = Enum.reject(embeds, & &1.virtual)
154+
155+ changes
156+ |> Map . take ( embeds )
157+ |> prepare ( types , adapter , repo , repo_action )
153158 end
154159
155160 defp prepare ( embeds , _types , _adapter , _repo , _repo_action ) when embeds == % { } do
@@ -158,9 +163,15 @@ defmodule Ecto.Embedded do
158163
159164 defp prepare ( embeds , types , adapter , repo , repo_action ) do
160165 Enum . reduce ( embeds , embeds , fn { name , changeset_or_changesets } , acc ->
161- { :embed , embed } = Map . get ( types , name )
162- Map . put ( acc , name , prepare_each ( embed , changeset_or_changesets , adapter , repo , repo_action ) )
163- end )
166+ case Map . get ( types , name ) do
167+ { :embed , % { virtual: false } = embed } ->
168+ prepared = prepare_each ( embed , changeset_or_changesets , adapter , repo , repo_action )
169+ Map . put ( acc , name , prepared )
170+
171+ { :embed , % { virtual: true } } ->
172+ acc
173+ end )
174+ end
164175 end
165176
166177 defp prepare_each ( % { cardinality: :one } , nil , _adapter , _repo , _repo_action ) do
0 commit comments