将我自己的模块定义为 Ecto 中的虚拟字段时出错

Error when defining my own module as a virtual field in Ecto

为什么我不能这样做:

  defmodule M1 do
    defstruct [:a, :b, :c, :d]
    # other stuff
  end


  # ...............

  schema "my_model" do
    # .................
    field :my_field, M1, virtual: true 

错误

      ** (ArgumentError) invalid or unknown type MyApp.M1 for field :my_field

模块M1已解析,但为什么不能使用?

如果你想在字段中存储一个 M1 结构,你可以通过将类型指定为 :any 来禁用 Ecto 的类型检查,这样你就可以在字段中存储任何东西:

field :my_field, :any, virtual: true

我无法让 Ecto 检查该字段是否是模块 M1 的结构,除非您为该模块实施 Ecto.Type 行为。