2017-03-28 8 views
1

私は私のプロジェクトでかなりのレベルの関係を持っています。コントローラでは、私はこれを持っている:これは正常に動作しますが、私は1つのレベルより深く行かなければならないEctoの3レベルの深い関係 - どのようにプリロードするか

var1 = Repo.get!(Model1, 123) |> Repo.preload([child_items1: :child_items2]) 

すなわち、それぞれchild_items2多くchild_items3です。今、child_items2ごとにchild_items3をプリロードするにはどうすればよいですか?

+3

てみ 'Repo.get(MODEL1クエリ1で、 123)|> Repo.preload([child_items1:[child_items2::child_items3]) '、どうなるか見てみましょう。 – JustMichael

答えて

0

私は通常スコープを使用します。たとえば、私のモデル(1)では、Model2をプリロードする関数with_model2があります。したがって、3つの関連付けを連続してロードするには、次のようなものがあります。

def with_model2(query \\ __MODULE__) do 
    from query, preload: [model2: ^Model2.with_model3] 
end 

for my Model(1)そして、あなたがアイデアを得る、モデル2は、私が実際に3レベルの深行ったことがない

def with_model3(query \\ __MODULE__) do 
    from query, preload: :model3 
end 

持っているだろうが、私はちょうどそれが働くだろうと仮定します。他人のために

0

documentationは実際に言う: ネストされた団体はまた、両方のフォーマットにプリロードすることができます!

Repo.all from p in Post, 
     preload: [comments: :likes] 

または

Repo.all from p in Post, 
     join: c in assoc(p, :comments), 
     join: l in assoc(c, :likes), 
     where: l.inserted_at > c.updated_at, 
     preload: [comments: {c, likes: l}] 
関連する問題