Phoenix,模型模式中的函数

问题描述 投票:0回答:2

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

  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
elixir phoenix-framework ecto
2个回答
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}

0
投票

另一种解决方案:

  @some_attributes ["attr_1", "attr_2"]

  schema "your_table" do
    for field <- @some_attributes do
      field field, :boolean, default: false
    end
  end
© www.soinside.com 2019 - 2024. All rights reserved.