如何在模式中添加功能?我想创建用于动态添加字段到模型架构的函数。示例:
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
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}
另一种解决方案:
@some_attributes ["attr_1", "attr_2"]
schema "your_table" do
for field <- @some_attributes do
field field, :boolean, default: false
end
end