You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:05:16