在Ecto模式块中调用自定义宏

时间:2018-10-06 09:58:31

标签: macros elixir metaprogramming ecto

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

我该怎么办?是什么原因造成的?

1 个答案:

答案 0 :(得分:2)

您需要在另一个模块中定义宏,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宏在后台运行的方式不允许您这样做。