Phoenix,模型架构中的功能

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)

Dog*_*ert 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
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)

  • 是的,但它与功能参数不完全相同.你必须使用quote/unquote.见http://elixir-lang.org/getting-started/meta/macros.html. (2认同)