【问题标题】:Composing an Ecto query with multiple columns in a where clause joined by OR用 OR 连接的 where 子句中的多列组成 Ecto 查询
【发布时间】:2016-01-26 08:22:35
【问题描述】:

假设我有这个查询:

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

我想把它变成一个函数,它可以获取字段名称和字段值的关键字列表并动态生成相同的查询。函数定义如下所示:

def where_any(query, field_names_to_values) do
  ...
end

Elixir 和 Ecto 可以做到这一点吗?

【问题讨论】:

标签: elixir ecto


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多