好吧,我正在寻找一种将我从db检索到的多个元素(相同的列名)传递到通道有效负载的好方法。
例如:ppl = Repo.all(People)
将使用id: 1, name: Mike
,id: 2, name: John
返回两个结果。 name:
(列名)用于Mike和John,但是当通过通道有效负载时,我只能传递一个地图,其中不能同时具有两个名称:John,name:Mike。
当我理解频道时,我们使用发送回客户端的地图(有效载荷)。我打算根据我从db获得的信息动态生成html。因此需要在一个地图/有效载荷中传递来自People的所有ppl。
我目前的计划是制作类似递归函数的东西,它将为ppl单独创建地图。 %{name1: John}
和%{name2: Mike}
然后使用Map.merge
将它们和路径合并为一个地图。所以,我的问题是:有没有更好的方法来路由有效负载中同一个表(同一列)的多个元素?任何建议/建议表示赞赏!
谢谢!
答案 0 :(得分:1)
所以,我的问题是:有没有更好的方法来路由有效负载中同一个表(同一列)的多个元素?
文档说有效负载必须是地图,但它可以包含可以序列化的任何。
Phoenix.Channel.broadcast(套接字,事件,消息)
向套接字主题的所有订阅者广播一个事件。
事件的消息必须是可序列化的地图。
https://hexdocs.pm/phoenix/Phoenix.Channel.html#broadcast/3
因此,您可以使用以下两种方法之一在有效负载中的密钥内传递一个列表:
如果Poison.Encoder
有[{1}}个实例,则可以执行以下操作:
Person
否则,只从查询中直接选择所需的键到地图中,然后发送:
broadcast socket, "people", %{people: Repo.all(Person)}
然后(在任何一种情况下)使用people = from(p in Person, select: map(p, [:id, :name])) |> Repo.all
broadcast socket, "people", %{people: people}
将其作为JS中的数组访问。