Elixir/Phoenix 通道负载映射

Elixir/Phoenix map for the channels payload

好吧,我正在寻找一种好方法来将我从数据库中检索到的多个元素(相同的列名)传递到通道有效负载中。

例如:ppl = Repo.all(People)将return两个结果与id: 1, name: Mikeid: 2, name: Johnname:(列名)同时用于 Mike 和 John,但是当通过通道有效载荷时,我只能传递一张地图,其中不能同时有两个名字:John,名字:Mike。

据我了解频道,我们使用发送回客户端的地图(有效负载)。我计划根据从数据库中获得的信息动态生成 html。因此需要将来自 People 的所有 ppl 传递给一个 map/payload.

我目前的计划是制作类似递归函数的东西,为 ppl 单独创建地图。 %{name1: John}%{name2: Mike} 然后使用 Map.merge 将它们和路径组合为一张地图。所以,我的问题是:是否有更好的方法从有效负载中的相同 table(同一列)路径多个元素?任何 suggestions/recommendations 感谢!

谢谢!

So, my question: is there a better way to path multiple elements from same table (same column) in the payload?

文档说负载必须是一个映射,但它可以包含任何可序列化的东西。

Phoenix.Channel.broadcast(socket, event, message)

Broadcast an event to all subscribers of the socket topic.

The event’s message must be a serializable map.

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

因此您可以使用以下两种方法之一在有效负载中的键内传递一个列表:

如果您有 PersonPoison.Encoder 实例,您可以:

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

否则,仅 select 查询中所需的键直接进入映射,然后发送:

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

然后(在任何一种情况下)使用 payload.people.

在 JS 中将其作为数组访问