2016-10-10 67 views
0

如何只更新地圖中的一個鍵,我想通過jsonb_set這樣執行:stackoverflow example或者在事務中避免數據庫中潛在的衝突,Ecto可以嗎?如何用`jsonb_set`在嵌入式模型模型中執行原子更新?

defmodule MySuperApp.Profile do 
    use MySuperApp.Model 
    schema "profiles" do 
    field :name, :string 
    embeds_one :settigns, MySuperApp.Settigns 
    end 
    def changeset(struct, params) do 
    struct 
    |> change 
    |> put_embed(:settigns, MySuerApp.Settigns.changeset(model, params)) 
    end 
end 
defmodule MySuperApp.Settigns do 
    use MySuperApp.Model 

    @settigns %{socket: true, page: true, android: false, ios: false} 

    embedded_schema do 
    field :follow, :boolean 

    field :action, :map, default: @settigns 
    end 

    def changeset(struct, _params) do 
    # I would like to update only web key and leave old keys 
    model |> change(action: %{web: false}) # this will override old map -> changes: %{action: %{web: false} 
    end 
end 

回答

1

編號Ecto目前不支持使用高級API(如更改集)的嵌入的部分更新。

您可以通過使用通過Ecto.Adapters.SQL.query/4或更新版本Repo.query/3的原始SQL查詢來實現此目的。