2016-05-31 3 views
3

Obwohl ich das Bestehen der Abfrage von this answer wie dies inspiriert Repository:Warum bekomme ich das Protokoll Enumerable nicht implementiert für # Ecto.Query?

teams_users = Repo.all (from(t in Team, where: t.owner_id == ^user_id)) 
    |> Enum.each(&team_users/1) 


def team_users (team) do 
    %{id: id} = team 
    Repo.all (from(tu in TeamUser, where: tu.team_id == ^id)) 
end 

Allerdings habe ich diesen Fehler habe:

[error] GenServer #PID<0.450.0> terminating 
** (Protocol.UndefinedError) protocol Enumerable not implemented for #Ecto.Query<from t in App.Team, where: t.owner_id == ^1> 
    (elixir) lib/enum.ex:1: Enumerable.impl_for!/1 
    (elixir) lib/enum.ex:116: Enumerable.reduce/3 
    (elixir) lib/enum.ex:1477: Enum.reduce/3 
    (elixir) lib/enum.ex:609: Enum.each/2 
    (App) web/channels/user_channel.ex:93: App.UserChannel.handle_in/3 
    (phoenix) lib/phoenix/channel/server.ex:223: Phoenix.Channel.Server.handle_info/2 
    (stdlib) gen_server.erl:615: :gen_server.try_dispatch/4 
    (stdlib) gen_server.erl:681: :gen_server.handle_msg/5 
    (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3 

Was ich versuche zu tun, alle Teams zu bekommen, dann holen Sie sich die Benutzer jedes Teams, dann erwarte ich, alle Benutzer in einem Array zu haben.

Vermisse ich etwas? irgendein Rat? Gibt es einen besseren Weg, dies zu erreichen?

Antwort

4

So haben Sie ein Problem hier mit diesem Code:

teams_users = Repo.all (from(t in Team, where: t.owner_id == ^user_id)) 
|> Enum.each(&team_users/1) 

Sie sollen den Raum zwischen Repo.all und (

teams_users = Repo.all(from(t in Team, where: t.owner_id == ^user_id)) 
|> Enum.each(&team_users/1) 

Sie dies auch als schreiben entfernen können:

teams_users = 
from(t in Team, where: t.owner_id == ^user_id) 
|> Repo.all() 
|> Enum.each(&team_users/1) 

Dies führt jedoch eine n + 1 Abfrage ein. Sie erstellen eine Abfrage, um Ihre Teams zu holen, und eine weitere, um die Teambenutzer abzurufen. Sie sollten hierzu in Repo.preload/2 schauen.

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

Aber wie würde ich die Zuordnung definieren: team_users in Schema Team? Ich benutze ecto 3.0-rc, und ich habe bereits eine viele zu viele Tabelle, aber ich habe keine Assoziationen in meinem Team, Benutzer-Schemas .. – simo

+0

https://hexdocs.pm/ecto/Ecto.Schema.html hinzugefügt # has_many/3 und https://hexdocs.pm/ecto/Ecto.Schema.html#belongs_to/3 sollten Ihnen helfen. – Gazler

+0

Ich kann 'besides_to' nicht zum Benutzer hinzufügen, da es keine' table_id' hat, ich benutze eine andere Tabelle 'team_user', um Team und Benutzer zu verknüpfen, die' user_id, team_id' hat, wie würde ich die Viele-zu-Viele-Verknüpfung definieren? – simo

Verwandte Themen