与 ecto 连接时如何 return select 值
How to return select values when join with ecto
我正在使用 ecto 2.2.6。
我正在尝试通过 ecto 进行左连接。
起初,我使用 List 来 return select 值和单个 table。 (1)
接下来我使用 Map to return select values 因为 table join。 (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 框。
它不起作用,因为我使用地图时没有密钥。
<%= select f, :group_id, Enum.map(@groups, &{&1.group_name, &1.group_id}) %>
我应该如何获得 select 并使用 select 值?
我想知道如何使用 ecto return select 值并在 select 框中接收一般信息。
实际上,您的第二种方法会在执行查询时生成一个元组列表。我们不能使用点语法来获取元组的元素。据我所知,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 一个包含您需要的信息的元组,并将查询结果直接传递给 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。
希望对您有所帮助。 =)
我正在使用 ecto 2.2.6。
我正在尝试通过 ecto 进行左连接。
起初,我使用 List 来 return select 值和单个 table。 (1)
接下来我使用 Map to return select values 因为 table join。 (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 框。 它不起作用,因为我使用地图时没有密钥。
<%= select f, :group_id, Enum.map(@groups, &{&1.group_name, &1.group_id}) %>
我应该如何获得 select 并使用 select 值? 我想知道如何使用 ecto return select 值并在 select 框中接收一般信息。
实际上,您的第二种方法会在执行查询时生成一个元组列表。我们不能使用点语法来获取元组的元素。据我所知,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 一个包含您需要的信息的元组,并将查询结果直接传递给 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。
希望对您有所帮助。 =)