You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Ecto获取可在HTML中迭代调用的Map结构?

如何调整Ecto查询结果,生成可直接按键访问的数据结构

看起来你离目标只差一步啦!你当前用Enum.map(&{&1.name, &1.id})生成的是元组列表(比如[{"Male", 1}, {"Female", 2}]),但模板里需要的是能通过:name、:id这类键名直接访问的结构。只需要调整Enum.map的逻辑,生成映射(map)列表就能解决问题。

解决方案:生成映射列表

这是最常用且直观的方式,生成的结构完全符合你想要的[{name: "Male", id: 1}, {name: "Female", id: 2}]:

defmodule HexProjectWeb.LandingController do
  use HexProjectWeb, :controller
  alias HexProject.Gender

  def index(conn, _params) do
    # 调整这里的map逻辑,用%{}创建映射
    genders = HexProject.Repo.all(Gender) |> Enum.map(&%{name: &1.name, id: &1.id})
    conn |> assign(:genders, genders) |> render(:index)
  end
end

模板中使用示例

现在你可以在HTML/EEx模板里轻松迭代并访问属性了:

<%= for gender <- @genders do %>
  <option value="<%= gender.id %>"><%= gender.name %></option>
<% end %>

额外技巧:用Ecto工具简化代码

如果你的Gender schema字段很多,不想手动写键值对,可以用Ecto.Schema.take/2直接提取指定字段,同样会返回映射列表:

genders = HexProject.Repo.all(Gender) |> Enum.map(&Ecto.Schema.take(&1, [:name, :id]))

内容的提问来源于stack exchange,提问作者Gotrek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:49:22