@@ -219,9 +219,14 @@ defmodule EctoNestedChangeset do
219219 defp nested_update ( :append , % Changeset { } = changeset , [ field ] , value )
220220 when is_atom ( field ) do
221221 new_value =
222- case { get_change_or_field ( changeset , field ) , changeset . action } do
223- { % NotLoaded { } , :insert } -> [ value ]
224- { previous_value , _ } -> previous_value ++ [ value ]
222+ case get_change_or_field ( changeset , field ) do
223+ % NotLoaded { } ->
224+ if Ecto . get_meta ( changeset . data , :state ) == :built ,
225+ do: [ value ] ,
226+ else: raise ( EctoNestedChangeset.NotLoadedError , field: field )
227+
228+ previous_value ->
229+ previous_value ++ [ value ]
225230 end
226231
227232 Changeset . put_change ( changeset , field , new_value )
@@ -236,9 +241,14 @@ defmodule EctoNestedChangeset do
236241 defp nested_update ( :prepend , % Changeset { } = changeset , [ field ] , value )
237242 when is_atom ( field ) do
238243 new_value =
239- case { get_change_or_field ( changeset , field ) , changeset . action } do
240- { % NotLoaded { } , :insert } -> [ value ]
241- { previous_value , _ } -> [ value | previous_value ]
244+ case get_change_or_field ( changeset , field ) do
245+ % NotLoaded { } ->
246+ if Ecto . get_meta ( changeset . data , :state ) == :built ,
247+ do: [ value ] ,
248+ else: raise ( EctoNestedChangeset.NotLoadedError , field: field )
249+
250+ previous_value ->
251+ [ value | previous_value ]
242252 end
243253
244254 Changeset . put_change ( changeset , field , new_value )
@@ -259,9 +269,14 @@ defmodule EctoNestedChangeset do
259269 defp nested_update ( :insert , % Changeset { } = changeset , [ field , index ] , value )
260270 when is_atom ( field ) and is_integer ( index ) do
261271 new_value =
262- case { get_change_or_field ( changeset , field ) , changeset . action } do
263- { % NotLoaded { } , :insert } -> [ value ]
264- { previous_value , _ } -> List . insert_at ( previous_value , index , value )
272+ case get_change_or_field ( changeset , field ) do
273+ % NotLoaded { } ->
274+ if Ecto . get_meta ( changeset . data , :state ) == :built ,
275+ do: [ value ] ,
276+ else: raise ( EctoNestedChangeset.NotLoadedError , field: field )
277+
278+ previous_value ->
279+ List . insert_at ( previous_value , index , value )
265280 end
266281
267282 Changeset . put_change ( changeset , field , new_value )
0 commit comments