Как добавить элемент в список в цикле в Эликсир / Феникс

Я изучаю Эликсир / Феникс, и передо мной стоит задача. Мне нужно отфильтровать результаты из базы данных в цикле. Что-то вроде этого:

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})

Но этот случай не позволяет мне добавлять элементы в список, почему? Потому что это функциональный язык... Есть ли способ добавлять элементы в список в цикле?

Ах да, может быть, вы спросите меня "Почему вы просто не получаете объекты из базы данных по идентификатору пользователя?" Я скажу, что room.users хранит массив json, закодированный в строку

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
Другие вопросы по тегам