在 SELECT 映射中设置值

Set the value in the SELECT map

我正在尝试将地图发送到前端。如果我像下面的代码一样在键中放置一个原子,它就可以正常工作。

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 的值转换为 atom 并使用它,但它不起作用。

您可以将 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)

%{key: value} 语法适用于 map 硬编码原子作为键。对于动态值,一个 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)}