gpt4 book ai didi

elixir - 为什么 Ecto 的 `cast` 不能将整数转换为字符串?

转载 作者:行者123 更新时间:2023-12-01 12:25:05 25 4
gpt4 key购买 nike

我有一个包含 field :owned_by_id, :string 的 Ecto 架构.我将该字段声明为字符串,因为我需要支持像“abc123”这样的值以及像“123”这样的值。

docs for cast/3说:

The second argument is a map of params that are cast according to the type information from data.



在我的模块中,我定义了 changeset像:
def changeset(struct, params \\ %{}) do
cast(struct, params, [:owned_by_id])
end

当我这样做时:
MyModule.changeset(%MyModule{}, %{owned_by_id: 1})

... 我希望 cast转动它 owned_by_id整数参数转换为字符串,基于 field宣言。

但是,我得到的是一个变更集,其中包括
errors: [owned_by_id: {"is invalid", [type: :string]}]

我可以调用 Integer.to_string(1)我自己,但不应该 cast处理?有没有办法让它自动处理这个?

最佳答案

虽然文档确实说参数是“根据类型信息强制转换的”,但 Ecto 没有为 Integer -> String 实现强制转换。我的猜测是,这是因为这很少需要,而 String -> Integer 转换对于通过 Web 表单发送输入时非常有用,其中所有字段都作为字符串到达​​。

如果您想要这种转换,您可以创建自定义类型。该文档有一个实现类似的自定义类型的示例:https://github.com/elixir-ecto/ecto/blob/d40008db48ec26967b847c3661cbc0dbaf847454/lib/ecto/type.ex#L29-L40

你的类型看起来像:

def type, do: :string

def cast(integer) when is_integer(integer) do
{:ok, Integer.to_string(integer)}
end
def cast(string) when is_binary(string), do: {:ok, string}
def cast(_), do: :error

...

注意:我不建议这样做。在我看来,显式转换会更简单,除非你正在实现一些复杂的东西,比如我上面链接到的文档示例。

关于elixir - 为什么 Ecto 的 `cast` 不能将整数转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613577/

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