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

能否扩展Phoenix生成器支持的自定义Ecto类型?

扩展Phoenix生成器支持自定义Ecto类型

问题描述

我有一个自定义Ecto类型:money_with_currency,希望在使用mix phx.gen.context生成新上下文时直接指定该类型,但生成器提示不支持这个类型:

期望执行命令:

mix phx.gen.context Invoicing Package packages price:money_with_currency

实际报错:

mix phx.gen.context Invoicing Package packages price:money_with_currency

** (Mix) Unknown type `:money_with_currency` given to generator. The supported types are: array, binary, boolean, date, decimal, enum, float, integer, map, naive_datetime, naive_datetime_usec, references, string, text, time, time_usec, utc_datetime, utc_datetime_usec, uuid

解决方案

方案1:全局配置扩展支持类型

在项目的config/config.exs中添加生成器配置,将自定义类型加入支持列表:

config :phoenix, :generators,
  ecto_types: [:money_with_currency | Phoenix.Generator.Ecto.default_types()]

保存配置后,再执行原来的生成命令就能成功识别自定义类型。

方案2:自定义生成器任务(按需定制)

如果需要对生成逻辑做更多扩展(比如自动导入自定义类型模块、添加字段验证),可以创建自定义生成器任务:

  1. 在项目中创建lib/mix/tasks/phx.gen.context_custom.ex文件:
defmodule Mix.Tasks.Phx.Gen.ContextCustom do
  use Mix.Task

  @impl true
  def run(args) do
    # 临时扩展支持的Ecto类型
    Application.put_env(:phoenix, :generators,
      ecto_types: [:money_with_currency | Phoenix.Generator.Ecto.default_types()]
    )

    # 调用原生上下文生成器执行逻辑
    Mix.Tasks.Phx.Gen.Context.run(args)
  end
end
  1. 运行自定义生成器:
mix phx.gen.context_custom Invoicing Package packages price:money_with_currency

注意事项

  • 确保自定义Ecto类型:money_with_currency已经正确实现了Ecto.Type行为,生成器仅负责识别类型名称,实际的类型序列化/反序列化逻辑需要自行完成。
  • 方案1是全局生效,所有Phoenix Ecto生成器(如phx.gen.schema)都会识别该类型;方案2更适合需要单独定制生成流程的场景。

内容的提问来源于stack exchange,提问作者arete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:35:32