【问题标题】:How to return select values when join with ecto与ecto连接时如何返回选择值
【发布时间】:2017-12-30 12:59:13
【问题描述】:

我正在使用 ecto 2.2.6。

我正在尝试通过 ecto 进行左连接。

起初,我使用 List 来返回单个表的选择值。 (1)

接下来,由于表连接,我使用 Map 返回选择值。 (2)

Repo.all(from m in "members",
    left_join: g in "groups",
           on: g.id == m.group_id,
        where: g.id == ^group_id
# select: [:id, :group_id, :name, :group_name] #(1)
# select: {m.id, m.group_id, m.name, g.group_name} #(2)
)

我想在 HTML 中制作选择框。 不工作,因为我使用地图时没有键。

<%= select f, :group_id, Enum.map(@groups, &{&1.group_name, &1.group_id}) %>

我应该如何获得选择和使用选择值? 我想知道如何使用 ecto 返回选择值并在一般选择框中接收。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    实际上,您的第二种方法将在执行查询时生成一个元组列表。我们不能使用点语法来获取元组的元素。据我所知,elixir 中的映射文字由%{} 表示。因此,将您的 select 更改为地图可能会有所帮助。像这样的东西:

    Repo.all(from m in "members",
        left_join: g in "groups",
               on: g.id == m.group_id,
            where: g.id == ^group_id
        select: %{
          id: m.id,
          group_id: m.group_id,
          name: m.name,
          group_name: g.group_name
        }
    )
    

    如果你没有使用额外的数据,你可以这样做

    Repo.all(from m in "members",
        left_join: g in "groups",
               on: g.id == m.group_id,
            where: g.id == ^group_id
        select: %{
          group_id: m.group_id,
          group_name: g.group_name
        }
    )
    

    或者你可以选择一个包含你需要的信息的元组,然后将查询结果直接传递给select标签

    Repo.all(from m in "members",
        left_join: g in "groups",
               on: g.id == m.group_id,
            where: g.id == ^group_id
        select: {m.group_id, g.group_name}
    )
    
    # And avoid the Enum.map in the select tag
    <%= select f, :group_id, @groups %>
    

    您可能感兴趣的 phoenix 文档:https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html#select/4

    希望对您有所帮助。 =)

    【讨论】:

    • 在 #2 的情况下,我无法识别地图 %{} 或元组 {}。谢谢你。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2018-07-11
    • 2020-10-11
    相关资源
    最近更新 更多