Elixir / Phoenix地图为频道有效载荷

时间:2016-08-28 06:51:49

标签: elixir phoenix-framework phoenix-channels

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

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

当我理解频道时,我们使用发送回客户端的地图(有效载荷)。我打算根据我从db获得的信息动态生成html。因此需要在一个地图/有效载荷中传递来自People的所有ppl。

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

谢谢!

1 个答案:

答案 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中的数组访问。