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