我使用的是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返回选择值,并在一般的选择框中重新接收。
答案 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。
希望它有所帮助。 =)