如果该功能已在嵌入式架构中存在并且不将其添加到列表中,我如何使此函数更新该项目的数量?

问题描述

我希望这些功能可以将商品添加到嵌入式模式中,该模式在电子商务应用程序中充当购物车,并且仅当购物车中已经存在的商品添加到其中时才更新数量。我当前的实现仅将商品添加到购物车中,但是当添加购物车中已经存在的商品时,并不会更新数量

 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}]}