taj*_*iro 1 elixir ecto phoenix-framework
我正在使用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)
)
Run Code Online (Sandbox Code Playgroud)
我想用HTML制作选择框.它不起作用,因为我使用Map时没有键.
<%= select f, :group_id, Enum.map(@groups, &{&1.group_name, &1.group_id}) %>
Run Code Online (Sandbox Code Playgroud)
我该如何选择并使用选择值?我想知道如何通过ecto返回选择值,并通常在选择框中重新显示.
实际上,您的第二种方法将在执行查询时生成元组列表.我们不能使用该点语法来获取元组的元素.据我所知,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
}
)
Run Code Online (Sandbox Code Playgroud)
如果你没有使用你可以做的额外数据
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
}
)
Run Code Online (Sandbox Code Playgroud)
或者您可以只选择包含所需信息的元组,并将查询结果直接传递给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 %>
Run Code Online (Sandbox Code Playgroud)
凤凰文档可能会让您感兴趣:https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html#select/4.
希望能帮助到你.=)