我正在尝试将地图发送到前端。如果我把一个原子放在键中,就像下面的代码一样,它可以正常工作。
defp build_select(queryable, opts_select) do
if opts_select == nil do
queryable
else
Enum.reduce opts_select, queryable, fn ({k, v}, queryable) ->
a = from q in queryable,
select: %{Data: field(q, ^(String.to_existing_atom k))}
end
end
end
但我想发送k值而不是数据。我该怎么做? K是一个字符串。
我尝试将k的值转换为原子并使用它,但它不起作用。
答案 0 :(得分:1)
%{key: value}
语法仅适用于硬件编码原子的地图 作为键。对于动态值,一个should use the hashrocket syntax:
这不起作用:
key = :foo
%{key: :bar}
#⇒ %{key: :bar}
这会:
key = :foo
%{key => :bar}
#⇒ %{foo: :bar} # NOTE :foo as a key
所以,回到你的例子:
- select: %{Data: field(q, ^(String.to_existing_atom k))}
+ key = String.to_existing_atom k
+ select: %{k => field(q, ^k)}
答案 1 :(得分:0)
您可以将map与插值字段列表一起使用。
select_list = Enum.map(opts_select, fn {k, _v} -> String.to_existing_atom(k) end)
from q in queryable,
select: map(q, ^select_list)