2016-10-06 3 views
1

Lassen Sie mich sagen, ich habe ein User Modell, das has_manyPost.Wie kann ich die Assoziation vorladen und sie in ecto zurückgeben?

holte ich einen Benutzer:

user = Repo.get(User, 1) 

und jetzt will ich alle Beiträge für diesen Benutzer bekommen. Die einzige Lösung, die ich gefunden habe, ist:

posts = Repo.preload(user, :posts).posts 

Aber es ist hässlich. Gibt es dafür eine Abkürzung?

Antwort

4

Sie Ecto.assoc/2 verwenden können eine Abfrage für alle Beiträge zu bekommen und dann das tatsächlich zu Repo.all/1 passieren, um sie zu holen:

iex(1)> user = Repo.get(User, 1) 
iex(2)> Ecto.assoc(user, :posts) 
#Ecto.Query<from p in MyApp.Post, where: p.user_id == ^1> 
iex(3)> Ecto.assoc(user, :posts) |> Repo.all 
[debug] QUERY OK source="posts" db=2.4ms 
SELECT p0."id", p0."title", p0."user_id", p0."inserted_at", p0."updated_at" FROM "posts" AS p0 WHERE (p0."user_id" = $1) [1] 
... 
+0

Was ist der Unterschied zwischen 'assoc' und' preload'? – arpit

+0

'assoc' erstellt eine Abfrage für bestimmte Assoziationen, ohne Daten von db abzurufen,' preload' ruft Daten von db für die Assoziation einschließlich verschachtelter Assoziationen ab. – Voldy

+0

Beachten Sie, dass 'preload/2' sowohl den übergeordneten Datensatz (Benutzer in diesem Fall) als auch die zugehörigen Datensätze (Posts) in einer Datenstruktur zurückgibt, während' assoc/2' piped zu 'Repo.all' nur die zugehörigen Datensätze zurückgibt (Beiträge). Das heißt, wenn Sie den übergeordneten Datensatz benötigen, können Sie ihn separat abrufen (wie im obigen Beispiel), aber Sie erhalten diese Daten nicht, wenn Sie ihn vollständig als Pipe-Anweisungen schreiben. – tomf

0
user = Repo.get(User, 1) |> preload(:posts) 

die Abkürzung für Ihren Fall ist

0
user = Repo.get(User, 1) |> Repo.preload([:posts]) 
+0

Während dieser Code die Frage möglicherweise beantwortet, wird es in der Regel als gute Praxis angesehen, eine Erläuterung dessen hinzuzufügen, was Ihr Code tut. Dies ermöglicht Entwicklern, die in diesem Bereich nicht vertraut sind, zu verstehen, was im Code vor sich geht, und ihnen zu helfen, zu lernen, wie sie das Problem selbst in Zukunft lösen können. –

Verwandte Themen