macros - 在 Ecto Schema 块中调用自定义宏
问题描述
Ecto 框架的模式模块定义:
defmodule Storage.Repo.Category do
use Ecto.Schema
schema "categories" do
field :name
field :path
field :color
field :desc
field :sequ, :integer
hello()
timestamps()
end
defmacro hello do
quote do
field :hello
end
end
end
编译失败
(CompileError) lib/storage/repo/category.ex:15: undefined function hello/0
我应该怎么办?这是什么原因?
解决方案
您需要在另一个模块中定义您的宏,require/import
然后调用它:
defmodule Storage.SchemaMacros do
defmacro hello do
quote do
field :hello
end
end
end
现在调用它:
defmodule Storage.Repo.Category do
use Ecto.Schema
import Storage.SchemaMacros
schema "categories" do
field :name
field :path
field :color
field :desc
field :sequ, :integer
hello()
timestamps()
end
end
您通常可以在同一个模块中定义和调用宏(只要在调用它之前定义),但是 Ecto 自己的schema/2
宏在后台工作的方式不允许您这样做。
推荐阅读
- data-visualization - AttributeError:“列表”对象没有属性“rgb2hex”
- jmeter - Jmeter中的IE记录问题
- java - 我正在构建一个 Wallpaper Changer Java 应用程序,但遇到 BATCH 刷新桌面壁纸的问题
- netlogo - NetLogo 3.1.5 版中的错误:没有定义任何名为 PICKUP-NEAREST-CIRCLE
- uwp - 如何在 UWP TextBox 中停止字符替换(如 ... 到省略号)
- javascript - RegEx 至少有 3 个字符,第一个和最后一个字符也应该是单引号
- sql-server - 动态存储过程未更新 SQL Server 表
- php - Laravel:在 href 中传递 {id}
- string - 从 UART 字符构建字符串 - 家庭学习 C
- node.js - MongoDB & Node.js - 如何用 $eq 和 $cond 对字段求和,其中表达式是对象数组