2017-07-03 59 views
0

我設計了像「Team < - Member」這樣的DB。 我想讓成員實體與團隊實體中的團隊名稱相關聯。 但我不知道要檢索會員加入的團隊名稱。如何使兩個實體與Elixir鳳凰城的關係的腳手架

members = Repo.all(Member) 
    teams = Repo.all(Team) 
    assign(conn, :teams, teams) 
    render(conn, "index.html", members: members) 

它像這樣檢索條件「select * from members M left join teams T on T.id = M.team_id」。

*問題*

  1. 如何讓球隊的名字在這樣的佈局index.html.eex?

在導軌的情況下,

index

  • 如何爲這樣佈局show.html.eex寫球隊名稱? show
  • <%= member.team.team_name>或<%= teams.team_name%> 但不工作我的期望。

    1. 如何在form.html.eex中的select標籤中寫入Team這樣的佈局? form

    <%=選擇樓:TEAM_ID,@teams%>也不起作用我的預期。

    回答

    1

    Repo.preload(:團隊)可以像RoR一樣工作。

    member_controller.ex

    plug :load_teams when action in [:new, :edit] 
    
    defp load_teams(conn, _) do 
        query = from(t in Team, select: {t.team_name, t.id}) 
        teams = Repo.all(query) 
        conn 
        |> assign(:teams, teams) 
    end 
    
    def index(conn, _params) do 
        members = Member |> Repo.all() |> Repo.preload(:team) 
        render(conn, "index.html", members: members) 
    end 
    
    def show(conn, %{"id" => id}) do 
        member = Member |> Repo.get!(id) |> Repo.preload(:team) 
        render(conn, "show.html", member: member) 
    end 
    

    index.html.eex

    <%= for member <- @members do %> 
        <%= member.team.team_name %> 
    <% end %> 
    

    show.html.eex

    <%= member.team.team_name %> 
    

    form.html.eex

    <%= render "form.html", changeset: @changeset, 
            teams: @teams, 
            action: member_path(@conn, :create) %> 
    

    新/ edit.html.eex

    <%= select f, :team_id, @teams, class: "form-control" %> 
    

    member.ex

    schema "members" do 
        belongs_to :team, PhoenixSample.Team 
        timestamps() 
    end 
    

    我做到了。謝謝。

    0

    如果您已經在遷移中指定了該模式包含對其他表的引用,例如。在您的案例模式Member將包含對Team的引用。這意味着成員表中包含team_id

    要使用它,您必須在Team模式(舊模式)中修改模式,方法是向Member加上適當的belongs_to,反之亦然has_one

    然後,您應該可以檢索特定成員的團隊。那麼,查詢團隊名稱應該非常簡單。

    例如。

    import Ecto.Query 
    import Ecto 
    team_name_query = from m in Member, where: m.id == ^selected_id, join: t in assoc(m, :team), select: {m.id, t.name}