【问题标题】:Elixir/Phoenix map for the channels payload通道有效负载的 Elixir/Phoenix 映射
【发布时间】:2017-01-04 10:47:50
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: elixir phoenix-framework phoenix-channels


    【解决方案1】:

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

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

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

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

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

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

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

    如果您有PersonPoison.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}
    

    然后(在任何一种情况下)使用 payload.people 在 JS 中将其作为数组访问。

    【讨论】:

    • 太棒了!非常感谢!我一直在为传递多个元素的方式而苦苦挣扎,但现在它是有道理的。刚刚测试并访问了你提到的数组。谢谢!
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2020-06-23
    相关资源
    最近更新 更多