嗯,我正在寻找一个好方法来传递多个元素(相同的列名),我已经从db检索到通道有效负载。
例如:ppl = Repo.all(People)
将返回id: 1, name: Mike
, id: 2, name: John
两个结果。name:
(列名)用于Mike和John,但是在传递通道有效负载时,我只能传递一个映射,其中不能同时具有name: John和name: Mike。
根据我对通道的理解,我们使用映射(有效负载)发送回客户端。我计划动态地生成html,基于我从数据库得到的信息。因此,需要在一个地图/有效负载中传递来自People的所有ppl。
我目前的计划是做一些类似于递归函数的东西,它将为ppl单独创建映射。%{name1: John}
和%{name2: Mike}
,然后使用Map.merge
将它们和path合并为一个地图。所以,我的问题:有没有更好的方法来路径多个元素从同一表(同一列)在有效载荷?任何建议/建议,感谢!
谢谢!
所以,我的问题:有没有更好的方法来路径多个元素从同一表(同一列)在有效载荷?
文档说有效负载必须是一个映射,但它可以包含任何可序列化的。
Phoenix.Channel。广播(socket, event, message)
向套接字主题的所有订阅者广播事件。
事件的消息必须是一个可序列化的映射。
https://hexdocs.pm/phoenix/Phoenix.Channel.html广播/3
所以你可以使用下面两种方法中的一种在有效载荷的键内传递一个列表:
如果你有Person
的Poison.Encoder
实例,你可以这样做:
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使用payload.people
。