如何在架构中添加功能?我想创建用于动态地将字段添加到模型模式的函数。例如:
def func do
# .. loop to create dynamic fields
field :street, :string
end
schema "objects" do
func
end
... Error:
** (CompileError) web/models/objects.ex:12: undefined function func/0
答案 0 :(得分:5)
func
需要位于单独的模块中,因为您要从此模块的主体中调用它。 func
也需要是一个宏,它返回一个包含field
调用的引用AST,以便field
能够将字段放在正确的模块中,因为field
也是宏。你正在寻找这样的东西:
defmodule MyApp.Post.Helper do
defmacro func do
quote do
field :foo, :string
end
end
end
defmodule MyApp.Post do
use MyApp.Web, :model
import MyApp.Post.Helper
schema "posts" do
func()
end
end
测试:
iex(1)> %Post{}
%MyApp.Post{__meta__: #Ecto.Schema.Metadata<:built, "posts">, foo: nil, id: nil}