如何从db获取多个记录并放入数组或映射

时间:2017-06-13 10:55:07

标签: arrays maps elixir elixir-framework

我想从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

但此方法返回空数组

下面是控制台输出

enter image description here

2 个答案:

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