Elixir 连接和预加载在Phoenix Exto上有什么区别

Elixir 连接和预加载在Phoenix Exto上有什么区别,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我不知道如何在凤凰城使用外星 我的模式是: schema "members" do field :first_name, :string field :last_name, :string belongs_to :prefecture, Prefecture timestamps() end schema "prefectures" do field :prefecture_name, :string has_many :members

我不知道如何在凤凰城使用外星

我的模式是:

schema "members" do
    field :first_name, :string
    field :last_name, :string
    belongs_to :prefecture, Prefecture

    timestamps()
  end

  schema "prefectures" do
    field :prefecture_name, :string
    has_many :members, Member

    timestamps()
  end
工作的预加载:

def list_members do
    Repo.all(Member)
      |> Repo.preload(:prefecture)
  end
并且在模板中可以用作:

<%= for member <- @members do %>
    <tr>
      <td><%= member.last_name %></td>
      <td><%= member.first_name %></td>
      <td><%= member.perfecture.prefecture_name %></td>
    </tr>
<% end %>
在模板中,按以下方式使用:

<%= for member <- @members do %>
    <tr>
      <td><%= member.last_name %></td>
      <td><%= member.first_name %></td>
      <td><%= member.prefecture_name %></td>
    </tr>
<% end %>
区别是什么?我应该怎么做才能让它工作?
我想用连接方式。(2) 这并不是说它不起作用。如错误所示,问题在于结果的格式

此代码的结果是:

Repo.all(Member)|>Repo.preload(:地区)
%成员{}
结构的列表。而另一个查询的结果是一个仅包含所选内容的地图列表

因此,出现了错误。它来自您正在使用的:


这些URL帮助程序可以根据应该使用的内容(id、slug等)从结构构建URL。但关键是,他们期望一个结构。如果要使用第二次查询结果的帮助程序,则必须将id直接传递给URL帮助程序
Routes.member\u path
,而不是整个
成员
结构。比如:


为此,您需要将成员的id添加到查询中的结果映射中:

def list_成员做什么
查询=来自成员中的m,
join:p在地区,on:p.id==m.epistration\u id,
选择:%{id:m.id,姓氏:m.last\u name,姓氏:m.first\u name,郡县名称:p.郡县名称}
全部回购(查询)
终止

这是指如果您正在使用URL的id(例如,
/members/:id
),如果您正在使用其他内容,则必须使用该id。

首先请澄清您的问题,显示perfecture模式是什么,并删除模板示例,因为它们不相关。能否显示调用
列表成员的代码?我想它在呈现模板或类似于def index(conn,_params)do members=Scoresheets.list_members()呈现(conn,“index.html”,members:members)endI之前就在控制器中。我不认为错误来自您共享的内容。您正在使用URL帮助器吗?比如
member\u路径(conn,:show,member)
或者类似的东西?如果是的话,请在你的问题中包括它。我的意思是在你的模板中。是否有从成员索引模板到成员的
:show
页面的链接?
%{id:m.id
不适用于
。有什么问题吗?您是否按照回答中的建议将
id
添加到查询中?(它被添加为地图的第一项)此外,您的路线是否使用了成员的id?我的意思是:
select:%{id:m.id,last\u name:m.last\u name,first\u name:m.first\u name,郡县名称:p.authority\u name}
你更新了它以包含id吗?是的。我想如果我把
%{id:m.id,
,那么
起作用。我可能会误解。不,不。看看更新的部分:
路由。成员路径(@conn,:show,member.id)
member.id
替换
member
是其中最重要的事情,因为如果您传递的不是结构,帮助程序将不知道使用什么。如果您使用
member.id
,它应该可以工作
<%= for member <- @members do %>
    <tr>
      <td><%= member.last_name %></td>
      <td><%= member.first_name %></td>
      <td><%= member.prefecture_name %></td>
    </tr>
<% end %>
maps cannot be converted to_param. A struct was expected, got: %{first_name: "Boo", last_name: "Muu", prefecture_name: "Japan"}