假设我有这个问题:
User
|> where([u], u.name == "John" or u.age == 24)
我想将此转换为一个函数,该函数可以获取字段名称和字段值的关键字列表,并动态生成相同的查询。函数定义如下所示:
def where_any(query, field_names_to_values) do
...
end
Elixir和Ecto有可能吗?
答案 0 :(得分:2)
通常不会提倡一个宏,但是ecto做了那么复杂的魔术,我认为在这种情况下最好保持抽象语法树的完整。
defmacro any_expr(var, [{key, value} | rest]) do
Enum.reduce(
rest,
quote do unquote(var).unquote(key) == unquote(value) end,
fn ({k, v}, acc) ->
quote do: unquote(acc) or unquote(var).unquote(k) == unquote(v)
end)
end
应该像这样工作:
User
|> where([u], any_expr(u, [name: "John", age: 24]))
(请注意,这是未经测试的代码......)