0

我正在研究 Elixir/Phoenix 并且有一个任务摆在我面前。我需要循环过滤数据库中的结果。像这样的东西:

user = Repo.get_by(User, api_token: token)
rooms = Repo.all(Room)
result = []
if !Enum.empty?(rooms) do
  Enum.each rooms, fn room ->
    users = Poison.decode!(room.users)
    if Enum.member?(users, user.id) do
       result = result ++ [room]
    end
  end
end
json(conn, %{"rooms" => result})

但是这种情况不允许我将项目附加到列表中,为什么?因为这是一种功能语言......有没有办法将项目附加到一个循环列表中?

哦,是的,也许你问我“为什么你只是不通过用户 ID 从数据库中获取对象?” 我会说 room.users 存储以字符串编码的 json 数组

4

1 回答 1

1

每当您想从列表中选择一些项目时,您可以使用Enum.filter/2. 您也可以使用in运算符代替Enum.member?/2.

user = Repo.get_by(User, api_token: token)
rooms = Repo.all(Room)
result = Enum.filter(rooms, fn room ->
  user.id in Poison.decode!(room.users)
end)

您也可以使用for代替Enum.filter/2

result = for room <- rooms, user.id in Poison.decode!(room.users), do: room
于 2017-06-07T09:19:43.920 回答