/ / Elixir / Phoenix mapa dla ładunku kanałów - eliksir, feniks-framework, feniks-kanały

Mapa Eliksir / Phoenix dla ładunku kanałów - eliksir, struktura feniksowa, kanały feniksowe

Cóż, szukam dobrego sposobu na przekazanie wielu elementów (ta sama nazwa kolumny), które pobrałem z db do ładunku kanałów.

Na przykład: ppl = Repo.all(People) zwróci dwa wyniki z id: 1, name: Mike, id: 2, name: John. The name: (nazwa kolumny) jest używana zarówno dla Mike'a, jak i Johna, ale przechodząc przez kanał danych, mogę przekazać tylko jedną mapę, na której nie mogę mieć jednocześnie obu nazwisk: John, imię: Mike.

Jak rozumiem kanały, używamy mapy (ładunku)który jest wysyłany z powrotem do klienta. Planuję generować html dynamicznie, w oparciu o informacje, które otrzymałem z bazy danych. Dlatego musisz przekazać wszystkie ppl od People w jednej mapie / ładunku.

Mój obecny plan polega na stworzeniu czegoś takiego jak funkcja rekurencji, która stworzy mapy oddzielnie dla ppl. %{name1: John} i %{name2: Mike} a następnie użyć Map.merge połączyć je i ścieżkę jako jedną mapę. Moje pytanie: czy istnieje lepszy sposób na ścieżkę wielu elementów z tej samej tabeli (tej samej kolumny) w ładunku? Doceniamy wszelkie sugestie / rekomendacje!

Dzięki!

Odpowiedzi:

1 dla odpowiedzi № 1

Moje pytanie: czy istnieje lepszy sposób na ścieżkę wielu elementów z tej samej tabeli (tej samej kolumny) w ładunku?

Dokumentacja mówi, że ładunek musi być mapą, ale może zawierać byle co to jest możliwe do serializacji.

Phoenix.Channel.broadcast (gniazdo, zdarzenie, wiadomość)

Transmisja zdarzenia do wszystkich subskrybentów tematu gniazda.

Komunikat wydarzenia musi być mapą, którą można serializować.

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

Możesz więc po prostu przekazać listę do klucza w ładunku, korzystając z jednego z dwóch podejść:

Jeśli masz Poison.Encoder instancja dla Person, możesz to zrobić:

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

w przeciwnym razie wybierz tylko wymagane klucze z zapytania bezpośrednio do mapy i wyślij to:

people = from(p in Person, select: map(p, [:id, :name])) |> Repo.all
broadcast socket, "people", %{people: people}

a następnie (w obu przypadkach) uzyskaj dostęp do niego jako tablicy w JS przy użyciu payload.people.