我希望这些函数将一个项目添加到一个嵌入式架构中,该架构在电子商务应用程序中用作购物车,并且在将购物车中已经存在的项目添加到其中时只更新数量。我当前的实现只将项目添加到购物车中,但在添加购物车中已存在的项目时会更新数量。
def add_to_cart(%Order{line_item: []} = cart, cart_params) do
attrs = %{line_item: [cart_params]}
update_cart(cart, attrs)
end
def add_to_cart(%Order{line_item: items} = cart, cart_params) do
items = items |> Enum.map(&Map.from_struct/1)
attrs =
case Enum.find(items, fn item -> cart_params[:item_id] == item.id end) do
nil ->
%{line_item: [cart_params | items]}
line_item = %{} ->
updated = %{line_item | quantity: cart_params[:quantity]}
Enum.map(items, fn i = %{id: id} ->
if id == line_item.id do
updated
else
i
end
end)
end
update_cart(cart, attrs)
end
def update_cart(%Order{} = cart, attrs) do
cart
|> Order.cart_changeset(attrs)
|> Repo.update()
end
如果删除以下内容会发生什么:
Enum.map(items, fn i = %{id: id} ->
if id == line_item.id do
updated
else
i
end
end)
使用Enum.group_by/2对这两种场景进行分组会有帮助吗?或者您的购物车中只能有一个项目吗?
cart_params = %{item_id: 1}
items = [%{id: 1}, %{id: 2}]
Enum.group_by(items, fn item ->
if cart_params[:item_id] == item.id do
:already_in_cart
else
:new_cart_item
end
end)
# %{already_in_cart: [%{id: 1}], new_cart_item: [%{id: 2}]}