2016-07-01 16 views
3

Ich versuche eine verschachtelte Abfrage in Ecto zu schreiben, die comments aus der Post-Tabelle vorlädt und dann in einer separaten Abfrage die user für jeden Kommentar vorlädt. Das sieht aus wie:Geschachteltes Vorladen in Ecto

post = Repo.preload(Repo.get(Post, id), [:comments]) 
comments = Repo.preload(post.comments, [:user]) 

Das Problem dabei ist, dass es 3 verschiedene Abfragen in der Datenbank ausgeführt wird, wenn ich weiß, dass es eine Möglichkeit ist es, alle Daten, die ich in einer Abfrage müssen geladen werden.

Hat es etwas mit join: assoc() zu tun?

+0

Erwarten Sie, dass _der genaue Code_ nur eine Abfrage ausführt? Oder suchen Sie nach einer anderen Möglichkeit, die nur eine Abfrage erfordert? Im ersten Fall scheint es unmöglich - Sie machen drei separate Aufrufe an Funktionen, die eine Abfrage durchführen. –

+0

Ich bin auf der Suche nach einer anderen Möglichkeit, das gleiche wie den Code zu tun, aber in einer Abfrage. Es würde also wie 'post = Repo.one (new_query)' enden –

Antwort

0

Ich denke nicht, dass es eine Möglichkeit gibt, das mit einer Abfrage zu tun, so weit ich weiß, müssten Sie die Kommentare und Benutzer zu dem Beitrag beitreten, und wenn es, sagen wir, 50 Kommentare, Sie hätte 50 Zeilen mit demselben Benutzer darin und ich weiß nicht, ob das für dich in Ordnung ist. Ich glaube, Sie aber, dass mit 2 Abfragen tun könnten, wäre es so etwas wie diese:

comments_query = 
    Comment 
    |> join(:inner, [c], u in assoc(c, :user)) 
    |> preload([c, u], user: u) 
post = Repo.preload(Repo.get(Post, id), comments: comments_query) 

ich den Code nicht getestet haben, aber ich glaube, dass es funktionieren soll oder zumindest Sie die allgemeine Idee.

1

(habe ich eine späte Antwort hier nur für meine eigene Referenz.) du versuchen können:

Repo.preload(Repo.get(Post, id), [{:comments, :user}]).comments 

oder äquivalent eine der beiden folgenden:

Repo.preload(Repo.get(Post, id), [comments: :user]).comments 
Repo.preload(Repo.get(Post, id), comments: :user).comments 

This blog post by tkowal hat ein Hervorragende Erklärung der Syntax zum Erstellen verschachtelter Preloads. This discussion between José Valim and a netizen ist auch nützlich.