0

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

例如:ppl = Repo.all(People)将返回两个带有id: 1, name: Mike,的结果id: 2, name: John。( name:column name) 用于 Mike 和 John,但是当通过通道有效负载时,我只能通过一个映射,其中不能同时具有两个名称:John,名称:Mike。

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

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

谢谢!

4

1 回答 1

1

所以,我的问题是:有没有更好的方法来从有效载荷中的同一表(同一列)中路径多个元素?

文档说有效载荷必须是地图,但它可以包含任何可序列化的内容。

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

向套接字主题的所有订阅者广播事件。

事件的消息必须是可序列化的映射。

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

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

如果你有一个Poison.Encoder实例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}

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

于 2016-08-28T07:05:58.300 回答