如何使用“jsonb_set”在嵌入式模式模型中执行原子更新?
How to perform atom update in embedded schema model with `jsonb_set`?
如何只更新地图中的一个键,我想通过 jsonb_set
执行它,如下所示:Whosebug example 或在事务中以避免数据库中的潜在冲突,Ecto 可以吗?
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
没有。 Ecto 目前不支持使用高级API(如变更集)对嵌入进行部分更新。
您可以通过 Ecto.Adapters.SQL.query/4
或更新版本 Repo.query/3
.
使用原始 SQL 查询来实现此目的
如何只更新地图中的一个键,我想通过 jsonb_set
执行它,如下所示:Whosebug example 或在事务中以避免数据库中的潜在冲突,Ecto 可以吗?
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
没有。 Ecto 目前不支持使用高级API(如变更集)对嵌入进行部分更新。
您可以通过 Ecto.Adapters.SQL.query/4
或更新版本 Repo.query/3
.