我想从db获取多条记录并放入数组或地图。
这是我的带有用户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
但此方法返回空数组
下面是控制台输出
答案 0 :(得分:3)
我认为这种方法比@ Dogbert的方法更优化(如果我错了,请更正我)因为我们直接要求Ecto格式化元组中的每一行然后我们使用内置的{tuples列表转换为地图{ {1}}。为此,您需要在当前模块中导入Enum.into/2
并且:
Ecto.Query
产生
query = from user in ApiDb.User,
where: user.id in ^user_ids,
select: {user.id, user}
Repo.all(query) |> Enum.into(%{})
对于Poison编码问题,我没有遇到有关数字键转换的任何问题,因为它们会被Poison自动转换为字符串。
希望这也有助于:)
答案 1 :(得分:2)
您无法在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
我建议在这里使用id IN _
查询,以便在一个查询中提取所有记录:
def array(conn, %{"array" => array}) do
users = from(u in ApiDb.User, where: u.id in ^array) |> Repo.all
map = for user <- users, into: %{}, do: {"#{user.id}", user}
json conn, map
end