2016-08-28 7 views
0

Nun, ich bin auf der Suche nach einer guten Möglichkeit, mehrere Elemente (selbe Spaltenname), die ich von db in die Kanäle Payload abgerufen haben.Elixir/Phoenix Karte für die Kanäle Payload

Zum Beispiel: ppl = Repo.all(People) gibt zwei Ergebnisse mit id: 1, name: Mike, id: 2, name: John zurück. Der name: (Spaltenname) wird sowohl für Mike als auch für John verwendet, aber wenn ich Kanal-Payload durchführe, kann ich nur eine Map passieren, wo beide Namen nicht gleichzeitig sein können: John, Name: Mike.

Wie ich Kanäle verstanden habe, verwenden wir eine Karte (Payload), die an den Client zurückgesendet wird. Ich plane, HTML dynamisch zu erzeugen, basierend auf den Informationen, die ich von der DB erhalten habe. Daher müssen alle Personen von People in einer Karte/Nutzlast übergeben werden.

Mein aktueller Plan ist es, etwas wie Rekursion-Funktion zu machen, die Karten separat für ppl erstellen wird. %{name1: John} und %{name2: Mike} und dann Map.merge verwenden, um sie und den Pfad als eine Karte zu kombinieren. Also, meine Frage: Gibt es eine bessere Möglichkeit, mehrere Elemente aus derselben Tabelle (gleiche Spalte) in der Payload zu verschieben? Irgendwelche Vorschläge/Empfehlungen geschätzt!

Danke!

Antwort

1

Also, meine Frage: gibt es eine bessere Möglichkeit, mehrere Elemente aus der gleichen Tabelle (gleiche Spalte) in der Nutzlast zu verschieben?

Die Dokumentation sagt, dass die Nutzlast eine Karte sein muss, aber es kann etwas enthalten, die serialisierbar ist.

Phoenix.Channel.broadcast (Buchse, Ereignis, message)

Sendung ein Ereignis an alle Teilnehmer des Sockels Thema.

Die Nachricht des Ereignisses muss eine serialisierbare Karte sein.

https://hexdocs.pm/phoenix/Phoenix.Channel.html#broadcast/3

So können Sie nur eine Liste in einem Schlüssel in der Nutzlast passieren eine dieser beiden Ansätze:

Wenn Sie eine Poison.Encoder Instanz für Person haben, können Sie tun:

broadcast socket, "people", %{people: Repo.all(Person)} 

Andernfalls wählen Sie nur die erforderlichen Schlüssel aus der Abfrage direkt in eine Karte und senden Sie diese:

und dann (in jedem Fall) als Array in JS mit payload.people darauf zugreifen.

+0

Großartig! Danke vielmals! Ich habe mit der Art und Weise gekämpft, wie ich mehrere Elemente passiere, aber jetzt macht es Sinn. Gerade getestet und zugegriffen, wie Sie als Array erwähnt. Vielen Dank! – Ilya