@@ -8,6 +8,7 @@ defmodule EctoNestedChangeset do
88
99 import Ecto.Changeset
1010
11+ alias Ecto.Association.NotLoaded
1112 alias Ecto.Changeset
1213
1314 @ doc """
@@ -215,11 +216,13 @@ defmodule EctoNestedChangeset do
215216
216217 defp nested_update ( :append , % Changeset { } = changeset , [ field ] , value )
217218 when is_atom ( field ) do
218- Changeset . put_change (
219- changeset ,
220- field ,
221- get_change_or_field ( changeset , field ) ++ [ value ]
222- )
219+ new_value =
220+ case { get_change_or_field ( changeset , field ) , changeset . action } do
221+ { % NotLoaded { } , :insert } -> [ value ]
222+ { previous_value , _ } -> previous_value ++ [ value ]
223+ end
224+
225+ Changeset . put_change ( changeset , field , new_value )
223226 end
224227
225228 defp nested_update ( :append , % { } = data , [ field ] , value ) when is_atom ( field ) do
@@ -230,11 +233,13 @@ defmodule EctoNestedChangeset do
230233
231234 defp nested_update ( :prepend , % Changeset { } = changeset , [ field ] , value )
232235 when is_atom ( field ) do
233- Changeset . put_change (
234- changeset ,
235- field ,
236- [ value | get_change_or_field ( changeset , field ) ]
237- )
236+ new_value =
237+ case { get_change_or_field ( changeset , field ) , changeset . action } do
238+ { % NotLoaded { } , :insert } -> [ value ]
239+ { previous_value , _ } -> [ value | previous_value ]
240+ end
241+
242+ Changeset . put_change ( changeset , field , new_value )
238243 end
239244
240245 defp nested_update ( :prepend , % { } = data , [ field ] , value )
@@ -249,6 +254,17 @@ defmodule EctoNestedChangeset do
249254 List . insert_at ( items , index , value )
250255 end
251256
257+ defp nested_update ( :insert , % Changeset { } = changeset , [ field , index ] , value )
258+ when is_atom ( field ) and is_integer ( index ) do
259+ new_value =
260+ case { get_change_or_field ( changeset , field ) , changeset . action } do
261+ { % NotLoaded { } , :insert } -> [ value ]
262+ { previous_value , _ } -> List . insert_at ( previous_value , index , value )
263+ end
264+
265+ Changeset . put_change ( changeset , field , new_value )
266+ end
267+
252268 defp nested_update ( :update , % Changeset { } = changeset , [ field ] , func )
253269 when is_atom ( field ) do
254270 value = get_change_or_field ( changeset , field )
0 commit comments