gpt4 book ai didi

postgresql - Ecto, Phoenix : How to update a model with an embeds_many declaration?

转载 作者:行者123 更新时间:2023-11-29 11:58:59 25 4
gpt4 key购买 nike

我有两个模型,OwnerProperty,其中 Owner 的模式有一个 embeds_many声明,像这样:

defmodule MyApp.Owner do
use MyApp.Web, :model

alias MyApp.Property

schema "owners" do
field name, :string
embeds_many :properties, Property
timestamps()
end

@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [])
|> validate_required([])
end
end

还有这个:

defmodule MyApp.Property do
use MyApp.Web, :model

embedded_schema do
field :name, :string
field :value, :float, default: 0
end

def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:name, :value])
|> validate_required([:name])
end
end

migration我正在使用的是:

defmodule MyApp.Repo.Migrations.CreateOwner do
use Ecto.Migration

def down do
drop table(:owners)
end

def change do
drop_if_exists table(:owners)
create table(:owners) do
add :name, :string
add :properties, :map
timestamps()
end
end
end

还有一个可能的 seed是:

alias MyApp.{Repo, Owner, Property}

Repo.insert!(%Owner{
name: "John Doe",
properties: [
%Property{
name: "Property A"
},
%Property{
name: "Property B",
value: 100000
},
%Property{
name: "Property C",
value: 200000
}
]
})

最后,我的问题是:如何将 John DoeProperty C 的值从 200000 更新为 300000 ?如果 John Doe 购买了 Property D:

%Property{
name: "Property D"
value: 400000
}

我如何将其添加到他在数据库中的 properties 中? (我正在使用 Postgres )。

最佳答案

最简单的方法是获取记录,更新属性列出并保存更改:

owner = Repo.get!(Owner, 1)
properties = owner.properties

# update all properties with name "Property C"'s value to 400000
properties = for %Property{name: name} = property <- properties do
if name == "Property C" do
%{property | value: 400000}
else
property
end
end

# add a property to the start
properties = [%Property{name: "Property D", value: 400000} | properties]

# or to the end
# properties = properties ++ [%Property{name: "Property D", value: 400000}]

# update
Owner.changeset(owner, %{properties: properties})
|> Repo.update!

您可以使用 JSON functionsprovided by PostgreSQL 执行一些操作(至少插入一个属性)使用fragment 但我认为您不能搜索并有条件地更新项目使用它们的数组。

关于postgresql - Ecto, Phoenix : How to update a model with an embeds_many declaration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com