2017-07-09 88 views
0

只有當字段不爲零時,如何將字段添加到changeset?如果值爲零,我不想更新數據庫中的值。我需要檢查3個字段,只更新那些不是零的字段。Ecto changeset - 跳過無字段

當前代碼:

put "/products" do 
    errors = {} 
    IO.inspect(conn.body_params) 

    product = Api.Product |> Api.Repo.get(conn.query_params["id"]) 
    IO.inspect(product) 

    if conn.body_params["image"] do 
     changeset = Api.Product.changeset(product, %{image: conn.body_params["image"]}) 
    end 

    if conn.body_params["description"] do 
     changeset = Api.Product.changeset(product, %{description: conn.body_params["description"]}) 
    end 

    if conn.body_params["price"] do 
     changeset = Api.Product.changeset(product, %{price: conn.body_params["price"]}) 
    end 
    case Api.Repo.update(changeset) do 
     {:ok, product} -> 
     errors = Tuple.append(errors, "Product updated") 
     {:error, changeset} -> 
     errors = Tuple.append(errors, "Product not updated") 
    end 

    conn 
     |> put_resp_content_type("application/json") 
     |> send_resp(200, Poison.encode!(%{ 
      successs: "success", 
      errors: Tuple.to_list(errors) 
     })) 
    end 

回答

1

您可以創建一個新的PARAMS只有按鍵映射該模式接受,其值不爲零使用for,並傳遞到changeset/2

product = Api.Product |> Api.Repo.get(conn.query_params["id"]) 
params = for key <- ~w(image description price), value = conn.body_params[key], into: %{}, do: {key, value} 
changeset = Api.Product.changeset(product, params) 
case Api.Repo.update(changeset) do 
    ... 
end 
0

這是validate_required/3是。 https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_required/3

將您的變更集和必填字段列表作爲原子傳遞給它。如果任何指定的字段不存在(即,nil),則會將錯誤添加到您的更改集中,並且該錯誤也將被標記爲無效。

iex> changeset |> validate_required([:field1, :field2, :field3]) 
%Ecto.Changeset{valid?: false, errors: %{"field1" => ["can't be blank"]}} 

PS。你不需要像以上那樣自己管理錯誤。錯誤將自動添加到您的變更集changeset.errors

+0

我需要他們能夠是零時插入。那麼我只需要在這裏更新他們,如果他們有價值而不是零。我需要確保它不會導致錯誤,如果其中一個是零,因爲其他的不需要保存。 – BeniaminoBaggins