2017-06-07 2 views
0

J'étudie Elixir/Phoenix et il y a une tâche devant moi. J'ai besoin de filtrer les résultats de la base de données dans un cycle. Quelque chose comme ceci:Comment ajouter un article à la liste en cycle dans 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}) 

Mais ce cas ne me permet pas d'ajouter des éléments à la liste, pourquoi? Parce que c'est un langage fonctionnel ... Y at-il un moyen d'ajouter des éléments à la liste dans un cycle? Oh oui, peut-être que vous me demandez "Pourquoi vous ne recevez pas d'objets de la base de données par ID utilisateur?" Je vais dire que le magasin room.users codé en chaîne json

Répondre

1

Chaque fois que vous souhaitez sélectionner des éléments dans une liste, vous pouvez utiliser Enum.filter/2. Vous pouvez également utiliser l'opérateur in au lieu de 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) 

Vous pouvez également utiliser for au lieu de Enum.filter/2:

result = for room <- rooms, user.id in Poison.decode!(room.users), do: room 
+0

Merci. C'est du travail, mais y a-t-il vraiment un moyen de le filtrer dans un cycle? Il me semble que cela ne marchera pas dans tous les cas –

+0

Si vous voulez faire des changements arbitraires à une variable en parcourant une liste, vous pouvez utiliser 'Enum.reduce/3'. Voici certaines de mes réponses qui utilisent 'Enum.reduce/3': https://stackoverflow.com/search?tab=newest&q=user%3a320615%20%5belixir%5d%20Enum.reduce. – Dogbert