在SELECT映射中设置值

时间:2017-12-06 08:49:15

标签: elixir phoenix-framework ecto

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

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

2 个答案:

答案 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)