查询表达式中带有动态字段名称的通用可组合 Ecto 查询
Generic composable Ecto query w/ dynamic field name in query expression
我试图允许在 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
有什么办法可以做到吗?
您需要使用field/2在查询中动态生成字段:
query
|> select([x], count(field(x, ^field_name), :distinct))
使用其他查询语法完成的示例:
from x in query,
select: count(field(x, ^field_name), :distinct)
我试图允许在 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
有什么办法可以做到吗?
您需要使用field/2在查询中动态生成字段:
query
|> select([x], count(field(x, ^field_name), :distinct))
使用其他查询语法完成的示例:
from x in query,
select: count(field(x, ^field_name), :distinct)