Elixir Phoenix,模型模式中的函数
如何在模式中添加函数?我想创建一个函数,用于向模型模式动态添加字段。例如:Elixir Phoenix,模型模式中的函数,elixir,phoenix-framework,ecto,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 func
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
还需要是一个宏,返回一个包含字段
调用的带引号的AST,以便字段
能够将字段放入正确的模块中,因为字段
也是一个宏。您正在寻找这样的东西:
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{{uuuuu meta}:{eto.Schema.Metadata,foo:nil,id:nil}
func
需要位于一个单独的模块中,因为您希望从该模块的主体调用它func
还需要是一个宏,返回一个包含字段
调用的带引号的AST,以便字段
能够将字段放入正确的模块中,因为字段
也是一个宏。您正在寻找这样的东西:
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{{uuuuu meta}:{eto.Schema.Metadata,foo:nil,id:nil}
我可以将参数传递给defmacro func..吗?可以,但它与函数参数不完全相同。您必须使用quote/unquote。请参见.Sidenote:defmacro
不是函数,它是。我可以将参数传递给defmacro func吗?是的,但它与函数参数不完全相同。您必须使用quote/unquote。请参见.Sidenote:defmacro
不是一个函数,而是一个函数。