2015-11-14 44 views
4

我有類似這樣的企業風險管理:預緊所有關係

--------  --------  -------- 
|ModelA|-----|ModelB|-----|ModelC| 
--------  --------  -------- 

我得到MODELA及其ModelBs下列要求:

modela = Repo.get(ModelA,1) 
modela = preload(modela, :modelb) 

現在我可以用modela.modelb訪問ModelB秒。但是我怎樣才能預加載ModelC?當我打印我的modelA時,它說,modelc未加載。

回答

3

讀更多的文檔上預載能尚未對此發表評論,但你必須定義MODELA嵌套關係。見Ecto.Schema

has_one :model_c, through: [:model_b, :model_c]

10

您可以將列表傳遞給Repo.preload以加載多個關聯。您甚至可以傳遞關鍵字列表來預載嵌套關聯。 我也覺得它有用加載,我需要在查詢本身(下面這兩個選項是相同的)一切:

query = from m in ModelA, preload: [modelb: :modelc] 
Repo.get(query, 1) 

Repo.get(ModelA, 1) |> Repo.preload(modelb: :modelc) 

您還可以{association_name, query}傳遞的元組的高級preloding - 在許多協會特別有用指定排序。

您可以在Ecto.Query.preload/3 docs

+0

如果我這樣做,它說ModelA與ModelC沒有關聯 – 0xAffe

1

您可以預載兩個B型,它是使用一個管道回購查詢C型協會,而不必在模型中包含A的模型定義A型和C型之間的關聯:

modela = Repo.get(ModelA, 1) 
     |> Repo.preload(:modelb) 
     |> Repo.preload(modelb: :modelc)