Yur*_*aga 0 elixir ecto phoenix-framework
如何在架构中添加功能?我想创建用于动态地将字段添加到模型模式的函数.例:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
测试:
iex(1)> %Post{}
%MyApp.Post{__meta__: #Ecto.Schema.Metadata<:built, "posts">, foo: nil, id: nil}
Run Code Online (Sandbox Code Playgroud)