案例语句在选择合并中设置为模型



这些是参数:

%{
"$select" => %{
"$avg" => ["arrive_at"],
"$count" => ["arrive_at"],
"$fields" => ["id"],
"$max" => ["cost"],
"$min" => ["arrive_at"],
"$sum" => ["arrive_at"]
}
}

这是代码:

select when is_map(select) ->
query = from(p in queryable, select: %{})
fields =
Enum.reduce(select, [], fn {key, value}, fields ->
Enum.reduce(value, query, fn {k, v}, query ->
case k do
"$avg" ->
val = Enum.at(v, 0)
query =
from(
p in query,
select_merge: %{avg: avg(field(p, ^String.to_atom(val)))}
)
"$count" ->
val = Enum.at(v, 0)
query =
from(
p in query,
select_merge: %{count: count(field(p, ^String.to_atom(val)))}
)
"$min" ->
val = Enum.at(v, 0)
query =
from(
p in query,
select_merge: %{min: min(field(p, ^String.to_atom(val)))}
)
"$max" ->
val = Enum.at(v, 0)
query =
from(
p in query,
select_merge: %{max: max(field(p, ^String.to_atom(val)))}
)
"$sum" ->
val = Enum.at(v, 0)
query =
from(
p in query,
select_merge: %{sum: sum(field(p, ^String.to_atom(val)))}
)
"$fields" ->
fields = Enum.at(v, 0)
IO.inspect(fields)
end
end)
end)
end

如果我在没有$fields语句的情况下运行此代码.它正确返回选择合并查询。

但是如果我用$fields运行它.它给了我错误。

(Protocol.UndefinedError) protocol Ecto.Queryable not implemented for [:id]

它将$fields的值作为我的模型名称并在查询中使用它

为什么它的行为是这样的?以$fields的值作为我的模型。

任何帮助将不胜感激。

谢谢。

你必须返回任何具有Ecto.Queryable实现(即Ecto.Query,(并且你的代码当前返回一个List(fields(。不要忘记你在reduce里面,返回的值是一个累加器。FWIW,

"$fields" ->
fields = Enum.at(v, 0)
IO.inspect(fields)
query   # ⇐ NOTE THE RETURNED VALUE 

将作为存根工作,直到正确实现。

最新更新