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
我该怎么办?是什么原因造成的?
答案 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
宏在后台运行的方式不允许您这样做。