如何从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
相关产品推荐
相关产品推荐

