2017-07-09 47 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