2016-06-01 10 views
4

Ich habe Teams und jedes Team hat Benutzer, so gibt es eine Join-Tabelle Benutzer-Teams als verknüpfen eine viele zu viele Beziehung, hier ist meine Modelle:Warum habe ich # Ecto.Association.NotLoaded?

defmodule App.Team do 
    use App.Web, :model 

    schema "teams" do 
    field :owner_id, :integer 
    has_many :team_users, {"team_user", App.TeamUser} 
    end 

end 
defmodule App.User do 
    use App.Web, :model 

    schema "users" do 
    # field :email, :string 
    has_many :team_user, App.TeamUser 
    end 
end 

Und hier ist das Modell anschließen:

defmodule App.TeamUser do 
    use App.Web, :model 

    @primary_key false 
    schema "team_user" do 
    belongs_to :user, App.User 
    belongs_to :team, App.Team 
    end 

end 

Wenn ich eine Abfrage ausführen, alle Teams eines Benutzers mit allen zu bekommen führte Benutzer-Teams, wie folgt aus:

teams_users = 
     from(t in Team, where: t.owner_id == ^user_id) 
     |> Repo.all() 
     |> Repo.preload(:team_users) 

ich dieses Protokoll erhalten:

[%App.Team{__meta__: #Ecto.Schema.Metadata<:loaded>, id: 1, 
    is_base_team: true, owner_id: 3, 
    team_users: [%App.TeamUser{__meta__: #Ecto.Schema.Metadata<:loaded>, 
    team: #Ecto.Association.NotLoaded<association :team is not loaded>, 
    team_id: 1, 
    user: #Ecto.Association.NotLoaded<association :user is not loaded>, 
    user_id: 3}, 
    %App.TeamUser{__meta__: #Ecto.Schema.Metadata<:loaded>, 
    team: #Ecto.Association.NotLoaded<association :team is not loaded>, 
    team_id: 1, 
    user: #Ecto.Association.NotLoaded<association :user is not loaded>, 
    user_id: 4}, 
    %App.TeamUser{__meta__: #Ecto.Schema.Metadata<:loaded>, 
    team: #Ecto.Association.NotLoaded<association :team is not loaded>, 
    team_id: 1, 
    user: #Ecto.Association.NotLoaded<association :user is not loaded>, 
    user_id: 5}]}] 

Im Protokoll habe ich Team mit der ID 1, und alle Benutzer mit ids: (3, 4, 5) Aber warum ich bekam user: #Ecto.Association.NotLoaded<association :user is not loaded>? Ich habe nicht darum gebeten, den Benutzer bei dieser ID zu laden. Warum also habe ich eine solche Warnung bekommen?

ich verwende {:phoenix_ecto, "~> 3.0-rc}

Antwort

4

Sie benötigen die :user sowie die :team_users vorzuladen:

teams_users = 
    from(t in Team, where: t.owner_id == ^user_id) 
    |> Repo.all() 
    |> Repo.preload(team_users: :user) 

Es gibt einen Abschnitt über verschachtelte Verbände in der Dokumentation ist.

Verwandte Themen