如何在使用ecto加入时返回选择值

问题描述 投票:1回答:1

我正在使用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制作选择框。它不起作用,因为我使用Map时没有键。

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

我该如何选择并使用选择值?我想知道如何通过ecto返回选择值,并通常在选择框中重新显示。

elixir phoenix-framework ecto
1个回答
5
投票

实际上,您的第二种方法将在执行查询时生成元组列表。我们不能使用该点语法来获取元组的元素。据我所知,elxir中的地图文字由%{}表示。因此,将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 %>

凤凰文件可能会让你感兴趣:https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html#select/4

希望能帮助到你。 =)

© www.soinside.com 2019 - 2024. All rights reserved.