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