Phoenix,模型架构中的功能

时间:2017-02-16 08:54:11

标签: elixir phoenix-framework ecto

如何在架构中添加功能?我想创建用于动态地将字段添加到模型模式的函数。例如:

  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

1 个答案:

答案 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}