Elixir 为什么外星&x27;s`cast`是否将整数转换为字符串?

Elixir 为什么外星&x27;s`cast`是否将整数转换为字符串?,elixir,ecto,Elixir,Ecto,我有一个外部模式,其中包括字段:owned\u by\u id,:string。我将字段声明为字符串,因为我需要支持像“abc123”这样的值以及像“123”这样的值 他们说: 第二个参数是参数的映射,这些参数根据数据中的类型信息进行转换 在我的模块中,我定义了changeset如下: def changeset(struct, params \\ %{}) do cast(struct, params, [:owned_by_id]) end 当我这样做时: MyModule.chang

我有一个外部模式,其中包括
字段:owned\u by\u id,:string
。我将字段声明为字符串,因为我需要支持像“abc123”这样的值以及像“123”这样的值

他们说:

第二个参数是参数的映射,这些参数根据
数据中的类型信息进行转换

在我的模块中,我定义了
changeset
如下:

def changeset(struct, params \\ %{}) do
  cast(struct, params, [:owned_by_id])
end
当我这样做时:

MyModule.changeset(%MyModule{}, %{owned_by_id: 1})
。。。我希望
cast
根据
字段
声明将
owned_-by_-id
整数参数转换为字符串

然而,我得到的是一个变更集,其中包括

errors: [owned_by_id: {"is invalid", [type: :string]}]

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

虽然文档确实说参数是“根据类型信息转换的”,但Ecto并没有实现整型->字符串的转换。我猜这是因为这很少需要,而字符串->整数转换对于通过web表单发送输入(其中所有字段都以字符串形式到达)非常有用


如果需要这种转换,可以创建自定义类型。文档中有一个实现类似功能的自定义类型示例:

您的类型看起来像:

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

...

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

如果您想要一个即插即用解决方案,您可以使用我创建的这个十六进制软件包

听起来像个虫子。