首页 > 解决方案 > 在 Ecto Schema 块中调用自定义宏

问题描述

Ecto 框架的模式模块定义:

defmodule Storage.Repo.Category do
  use Ecto.Schema

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end

  defmacro hello do
    quote do
      field :hello
    end
  end
end

编译失败

 (CompileError) lib/storage/repo/category.ex:15: undefined function hello/0

我应该怎么办?这是什么原因?

标签: macroselixirmetaprogrammingecto

解决方案


您需要在另一个模块中定义您的宏,require/import然后调用它:

defmodule Storage.SchemaMacros do
  defmacro hello do
    quote do
      field :hello
    end
  end
end

现在调用它:

defmodule Storage.Repo.Category do
  use Ecto.Schema
  import Storage.SchemaMacros

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end
end

您通常可以在同一个模块中定义和调用宏(只要在调用它之前定义),但是 Ecto 自己的schema/2宏在后台工作的方式不允许您这样做。


推荐阅读