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
...
注意:我不建议这样做。在我看来,显式转换会更简单,除非您正在实现一些复杂的东西,如我上面链接的文档示例。如果您想要一个即插即用解决方案,您可以使用我创建的这个十六进制软件包 听起来像个虫子。