elixir - 在由OR连接的where子句中组成具有多个列的Ecto查询

标签 elixir ecto

假设我有这个查询:

User
|> where([u], u.name == "John" or u.age == 24)

我想将其转换为一个函数,该函数可以采用字段名称和字段值的关键字列表,并动态生成相同的查询。函数定义如下所示:
def where_any(query, field_names_to_values) do
  ...
end

Elixir和Ecto可以做到吗?

最佳答案

通常不会提倡使用宏,但是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]))

(请注意,这是未经测试的代码...)

关于elixir - 在由OR连接的where子句中组成具有多个列的Ecto查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35009501/

相关文章:

enums - 枚举 Elixir 数据(包括嵌套)并在 EEx 中显示键/值?

python - 你如何使用 Elixir 解析 150g csv 文件? shell ? SQL数据库?

elixir - 使用字符串查询仓库

Elixir/Phoenix 限制参数,如 Rails 强参数

elixir - Phoenix - 将 Ecto 查询结果返回给特定的客户端

api - 使用 httpotion elixir 发布到 slack api

string - Elixir 只大写一个单词的第一个字母

arrays - 在 Elixir 中,推荐使用什么方法来生成 "const array"的等价物?

database - 如何通过算法修改字段