Arrays 如何从数据库中获取多条记录并放入数组或映射

Arrays 如何从数据库中获取多条记录并放入数组或映射,arrays,maps,elixir,Arrays,Maps,Elixir,我想从数据库中获取多条记录,并将其放入数组或映射中 这是我的带有用户ID的示例数组 {"array":[133,136,137] } 这是我的密码 def array(conn, %{"array" => array}) do userlist = %{} Enum.each(array, fn(x) -> Map.put(userlist, x, Repo.get(ApiDb.User, x)) end) json

我想从数据库中获取多条记录,并将其放入数组或映射中

这是我的带有用户ID的示例数组

{"array":[133,136,137] }
这是我的密码

def array(conn, %{"array" => array}) do
      userlist = %{}
      Enum.each(array, fn(x) ->
         Map.put(userlist, x, Repo.get(ApiDb.User, x))
      end)
      json conn, userlist
  end
但此方法返回空数组

下面是控制台输出


您不能从
Enum.each
内修改
Enum.each
外部变量的值。对于这个特定的例子,我将使用
For
遍历列表,获取用户,并将其放入一个id为键的映射中:

def array(conn, %{"array" => array}) do
  users = for x <- array, into: %{}, do: {"#{x}", Repo.get(ApiDb.User, x)}
  json conn, users
end

我认为这种方法比@Dogbert的方法更优化(如果我错了,请纠正我),因为我们直接要求Ecto格式化元组中的每一行,然后使用内置的
Enum.into/2
将元组列表转换为映射。为此,您需要在当前模块中导入
exto.Query
,并:

query = from user in ApiDb.User,
        where: user.id in ^user_ids, 
        select: {user.id, user}

Repo.all(query) |> Enum.into(%{})
产生

%{id1=>user1,id2=>user2…}

对于毒药编码问题,我没有遇到任何关于数字键转换的问题,因为它们会被毒药自动转换成字符串


希望这也有帮助:)

两个获取**(Poison.EncodeError)所需的字符串或原子键,获取:133错误。我在lib文件夹中有那个毒物编码器。dempl Poison.Encoder,for:Any do def encode(%{struct:}=struct,options)do map=struct |>map.from|struct |>sanitize|map |>Poison.encode(options)#Poison.encode.map.encode(map,options)end defp sanitize|map(map)do map.drop(map,[::::::(元,:)结构)end end我已经更新了答案以将键转换为字符串。这应该行得通。让我知道。
query = from user in ApiDb.User,
        where: user.id in ^user_ids, 
        select: {user.id, user}

Repo.all(query) |> Enum.into(%{})