2016-12-08 1 views
1

Ich habe eine 3-Ebenen-Hierarchie Modellbeziehung vorzubelasten, das heißt, model1 gehört model2model2 und gehört zu model3.kann nicht mit mehreren Hierarchiemodell

Ich versuche model2 und model3 für die model1 vorzuladen:

my_models = Repo.all(Model1) 
    |> Enum.map(fn (x) -> 
     Repo.preload(x, :model2) 
    end) 
    |> Enum.map(fn(x) -> # error "no function clause matching in Ecto.Repo.Preloader.preload/4" 
     Repo.preload(x.model2, :model3) 
    end) 

Der Fehler ist "keine Funktion Klausel Anpassung in Ecto.Repo.Preloader.preload/4"

+1

Warum Vorbelastung Sie in 'Enum.map'? Das vereitelt den ganzen Zweck des Vorladens. Warum nicht? Repo.all (Model1) |> Rep.preload (model2: [: model3]) '? – Dogbert

+0

@Dogbert, arbeitet nicht vorladen nur auf einer einzigen Einheit? – Kooooro

+0

Nein, funktioniert auch in Listen und unterstützt auch das effiziente Laden verschachtelter Assoziationen. – Dogbert

Antwort

0

Sie tun können:

my_models = Repo.all(Model1) |> Repo.preload(model2: :model3) 

Beachten Sie, dass dies nicht das gleiche ist:

my_models = Repo.all(Model1) |> Repo.preload([:model2, :model3]) 

Wie in https://hexdocs.pm/ecto/Ecto.Query.html#preload/3

Wenn Sie mehr von der Fehlermeldung zur Verfügung stellen können, ich in der Lage sein zu erklären, warum Sie diese Fehlermeldung bekommen. Es ist wahrscheinlich, dass Modell2 (in der 2.) ist nil, und https://github.com/elixir-ecto/ecto/blob/66e90c97054cd855c7cbb694bc79a0b9313f119b/lib/ecto/repo/preloader.ex#L36 funktioniert nur mit einer map oder list.

Die Verwendung der geschachtelten Vorspannung wie oben wird diesen Fall für Sie behandeln.

+0

das funktioniert nicht, sie werden nicht vorgeladen. ist es, weil es von "gehört" und nicht "has_many" wie die Dokumentation geht? – Kooooro

+0

Dies sollte auf jeden Fall mit beiden funktionieren. Könnten Sie bitte Ihr Schema und das Ergebnis der Ausführung von Repo.preload (model1, model2:: model3) in Ihrer Frage angeben, um das Problem zu identifizieren? – Gazler

+0

das: model3 wird nicht geladen, soll ich Model3 -> Model1 "has_many through" oder ähnliches haben? – Kooooro

0
Repo.preload([{:model2, :model3}]) 

Sollte der Trick tun. Sie können diese Struktur so tief verschachteln, wie Sie möchten. Z.B. 5 Modelle tief:

Repo.preload([ 
    {:model1, [ 
    {:model2, [ 
     {:model3, [ 
     {:model4, :model5} 
     ]} 
    ]} 
    ]} 
]) 
+0

funktioniert nicht ... – Kooooro

+0

das model2 wird geladen, model3 ist nicht – Kooooro

+0

Zur Referenz '[{: model2,: model3}]' ist genau das gleiche wie '[model2:: model3]' http: // elixir-lang.org/getting-started/keywords-and-maps.html#keyword-lists – Gazler

Verwandte Themen