【问题标题】:Generic composable Ecto query w/ dynamic field name in query expression查询表达式中带有动态字段名称的通用可组合 Ecto 查询
【发布时间】:2016-01-06 19:56:23
【问题描述】:

我正在尝试允许传入字段名称并在 Ecto 查询表达式中动态运行它,如下所示:

def count_distinct(query, field_name) when is_binary(field_name) do
  query
  |> select([x], count(Map.fetch!(x, field_name), :distinct))
end

但是,我得到这个编译错误:

(Ecto.Query.CompileError) `Map.fetch!(x, field_name)` is not a valid query expression

有没有办法做到这一点?

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    您需要使用field/2在查询中动态生成字段:

    query
    |> select([x], count(field(x, ^field_name), :distinct))
    

    使用其他查询语法完成的示例:

    from x in query,
      select: count(field(x, ^field_name), :distinct)
    

    【讨论】:

    • 太近了!谢谢! :D
    • 这是否可能不使用原子,而是使用普通字符串?将每个潜在的动态字段转换为一个不能被垃圾回收的原子似乎是个坏主意。
    • @Tarlen 如果您需要将用户输入的字符串转换为原子,您可以使用to_existing_atom。使用原子很好,因为如果该字段存在于模式中,则原子将已经存在。
    • 问题是我让用户将自己的字段添加到模型中,所以我在设计时无法知道他们
    • 您使用的是哪个数据库?如果字段函数不适合您,请考虑使用片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2014-07-06
    相关资源
    最近更新 更多