如何在 Elixir/Phoenix 中将项目添加到循环列表

How to add an item to list in cycle in Elixir/Phoenix

我正在学习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})

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

哦,是的,也许你问我 "Why you just don't get objects from the database by user id?" 我会说 room.users 存储 json 编码为字符串

的数组

只要你想 select 列表中的某些项目,你可以使用 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