在map / 2中使用动态值

问题描述 投票:0回答:1

所以我读到了Ecto.Query.API.map/2函数,我有一个场景,我必须使用它。

查询是这样的:

  from p in model,
    where: p.id == 1,
    select: map(p, [:id, :inserted_by, customer: [:id, :first_name]])

所以不是idinserted_by硬编码和idfirst_name。我想在这样的列表中使用动态值

  [:id, :inserted_by, :first_name]

我尝试通过在变量中保存列表来使用^运算符。但它给出了错误cannot use outside of match clause如何更改动态值的查询?像这样

  select: map(p, [^dynamic_value, customer: ^dynamic_value])

谢谢。

elixir phoenix-framework ecto
1个回答
1
投票

官方Ecto文件按字面意思回答了这个问题的第二句话:

Ecto.Query.API.map/2也可用于动态选择字段:

fields = [:title, :body]
from p in Post, select: map(p, ^fields)

在你的情况下将是:

dynamic_value = [:id, :inserted_by, customer: [:id, :first_name]]

from p in model,
where p.id == 1,
select: map(p, ^dynamic_value)

预先定义dynamic_value的问题是:简而言之,from是一个宏,它内部有一个复杂的逻辑,它接受准备好的AST。

© www.soinside.com 2019 - 2024. All rights reserved.