@@ -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
@@ -144,7 +145,11 @@ defmodule Ecto.Embedded do
144145 @ doc false
145146 def prepare ( changeset , embeds , adapter , repo_action ) do
146147 % { changes: changes , types: types , repo: repo } = changeset
147- prepare ( Map . take ( changes , embeds ) , types , adapter , repo , repo_action )
148+ #non_virtual_embeds = Enum.reject(embeds, & &1.virtual)
149+
150+ changes
151+ |> Map . take ( embeds )
152+ |> prepare ( types , adapter , repo , repo_action )
148153 end
149154
150155 defp prepare ( embeds , _types , _adapter , _repo , _repo_action ) when embeds == % { } do
@@ -153,8 +158,14 @@ defmodule Ecto.Embedded do
153158
154159 defp prepare ( embeds , types , adapter , repo , repo_action ) do
155160 Enum . reduce embeds , embeds , fn { name , changeset_or_changesets } , acc ->
156- { :embed , embed } = Map . get ( types , name )
157- Map . put ( acc , name , prepare_each ( embed , changeset_or_changesets , adapter , repo , repo_action ) )
161+ case Map . get ( types , name ) do
162+ { :embed , % { virtual: false } = embed } ->
163+ prepared = prepare_each ( embed , changeset_or_changesets , adapter , repo , repo_action )
164+ Map . put ( acc , name , prepared )
165+
166+ { :embed , % { virtual: true } } ->
167+ acc
168+ end
158169 end
159170 end
160171
0 commit comments