gpt4 book ai didi

elixir - Ecto 模式默认值不包含在变更集更改中

转载 作者:行者123 更新时间:2023-12-04 13:20:59 25 4
gpt4 key购买 nike

考虑以下架构:

defmodule EctoBug.Post do
use Ecto.Schema
import Ecto.Changeset

schema "posts" do
field :title, :string, default: "test"

timestamps()
end

def changeset(post, attrs) do
post
|> cast(attrs, [:title])
|> validate_required([:title])
end
end

如果我这样做

changeset = EctoBug.Post.changeset(%EctoBug.Post{}, %{title: "test"})

title 字段在 changes 中不存在:

#Ecto.Changeset<action: nil, changes: %{}, errors: [], data: #EctoBug.Post<>, valid?: true>

我找不到关于此行为的任何信息。

这是一个错误吗?

最佳答案

Ecto 的变更集结构保存应用于模式/结构的变更。默认值未显示为更改的原因是,当您执行 %EctoBug.Post{} 时,它会填充您在架构上设置的默认值。然后,当您转换参数时,由于该字段的原始值和转换值相同,所以它并不是真正的更改,也没有标记为更改。

如果你这样做

changeset = EctoBug.Post.changeset(%EctoBug.Post{}, %{title: "test"})
Ecto.Changeset.get_field(changeset, :title)

您应该看到标题已设置。虽然 Ecto.Changeset.get_change(changeset, :title) 会给你 nil 因为它没有从最初给出的原始结构中改变。

如果您为字段 title 提供的值不同于默认值,您应该会看到它将作为更改进行跟踪。

因为它是这样工作的,现在如果你有一个你试图更新而不是创建的记录,如果你针对该记录转换一些实际上与它已经拥有的参数相同的参数,ecto 可以跳过尝试更新记录,因为它可以看到没有任何改变。在插入的情况下,即使它没有变化,Ecto 也会尝试插入它。

关于elixir - Ecto 模式默认值不包含在变更集更改中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52793233/

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