如何为Ecto嵌入式Schema设置可选值?
解决Ecto嵌入式Schema中可选值与枚举的编译错误
问题本质
你碰到的编译错误,核心是误用了Elixir的|操作符:
- 针对
customer_id的:integer | nil写法:Ecto字段类型不支持这种语法,因为Ecto默认允许字段为nil(除非显式设置null: false)。 - 针对
stage的枚举写法:[:bought | :in_shop_cart | :canceled]是错误的列表构造方式,正确的列表元素分隔应该用逗号。
修正后的代码
defmodule Order do use Ecto.Schema embedded_schema do # 无需写 :integer | nil,默认允许为 nil,也可显式加 default: nil 明确意图 field(:customer_id, :integer, default: nil) # 枚举值用逗号分隔的列表,使用Ecto推荐的Ecto.Enum类型 field(:stage, Ecto.Enum, values: [:bought, :in_shop_cart, :canceled]) field(:details, :string) end end
关键说明
- 可选字段处理:Ecto的
field/3函数中,字段默认允许为nil,不需要用类型联合语法。如果想让代码意图更清晰,可以加上default: nil参数明确指定默认值。 - 枚举类型处理:Ecto 3.0及以上版本推荐使用
Ecto.Enum类型定义枚举,通过values:参数传入枚举值的列表,旧的enum:选项已被废弃。
内容的提问来源于stack exchange,提问作者Flame_Phoenix
相关产品推荐
相关产品推荐

