2017-06-07 1 views
0

Ich studiere Elixier/Phoenix und es gibt eine Aufgabe vor mir. Ich muss Ergebnisse von der Datenbank in einem Zyklus filtern. Etwas wie folgt aus:Wie man einen Gegenstand hinzufügt, um ihn in einem Zyklus in Elixir/Phoenix zu markieren

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

Aber dieser Fall nicht gestatten Sie mir Artikel anhängen aufzulisten, warum? Weil dies eine funktionale Sprache ist ... Gibt es eine Möglichkeit, Elemente anzuhängen, die in einem Zyklus aufgelistet werden sollen?

Oh yeah, vielleicht fragst du mich "Warum bekommst du einfach keine Objekte aus der Datenbank nach Benutzer-ID?" Ich werde sagen, dass die room.users JSON-Array in Zeichenfolge codiert

Antwort

1

Immer wenn Sie einige Elemente aus einer Liste auswählen möchten, können Sie Enum.filter/2 verwenden. Sie können auch den Operator in anstelle von Enum.member?/2 verwenden.

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) 

Sie können auch for statt Enum.filter/2 verwenden:

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

Dank. Es ist Arbeit, aber gibt es wirklich einen Weg, wie man es in einem Zyklus filtert? Es scheint mir, dass dies nicht in allen Fällen funktionieren wird. –

+0

Wenn Sie eine Variable während des Durchlaufens einer Liste beliebig verändern wollen, können Sie 'Enum.reduce/3' verwenden. Hier sind einige meiner Antworten, die 'Enum.reduce/3' verwenden: https://stackoverflow.com/search?tab=newest&q=user%3a320615%20%5belixir%5d%20Enum.reduce. – Dogbert

Verwandte Themen