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

时间:2017-12-30 03:37:12

标签: elixir phoenix-framework ecto

我使用的是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返回选择值,并在一般的选择框中重新接收。

1 个答案:

答案 0 :(得分:5)

实际上,第二种方法会在执行查询时生成元组列表。我们不能使用该点语法来获取元组的元素。据我所知,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 %>

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

希望它有所帮助。 =)