我正在学习Elixir,遇到了这种情况:
我有一个Ecto模式,我想做一个像“ get_by”这样的函数,它带有一个列名,并且它的值是这样的一个参数:get_by(:id,7)
因此,该功能的工作版本如下:
def get_by(column,value) do
Repo.all(
from(
r in __MODULE__,where: field(r,^column) == ^value,)
)
end
我知道它可以完全正常工作,但是我想知道field
宏的工作原理。
原始代码对我来说太难读了。我试图在宏中使用AST,但似乎没有任何效果。我最好的是:
defmacro magic(var,{:^,_,[{column,_}]}) do
dot = {:.,[],[var,column]}
{dot,[]}
end
但这将返回r.column
而不是绑定到column
变量的原子。
应当如何编写宏以返回r.id
?