2015-04-12 12 views
14

Ön yüklemeleri açıkça kullanmadan ecto ilişkilendirmelerini önceden yüklemek için herhangi bir yol var mı?Varsayılan olarak Ecto Derneklerini Önceden Oluşturma

Şemada bir seçenek gibi bir şey var mı?

schema "gadgets" do 
    field :foo, 
    has_many :bars, Myapp.Bar, preload: true 
end 

Ben

Repo.get(Gadget, id) 
    |> Repo.preload: [:bars] 

Edit gibi bir şey yapıyorum: Bunu çalışıyorum nedeni Zaten önceden yüklenmiş ilgili modele ilgili bir model önceden yüklemek istiyorum, çünkü,

gibi
preload: [:invoices preload: :items] 
Ayrıca sorgusunun bir parçası olarak önyükleyebilir

cevap

29

:

defmodule Gadget do 
    use Ecto.Model 

    # ... 

    def with_invoices(query) do 
    from q in query, preload: [invoices: :items] 
    end 
end 
Sonra

:

Gadget 
|> Gadget.with_invoices 
|> Repo.get!(id) 
+7

herhangi nedeni şemada bir seçenek değildir mı? Sorgulama sırasında önyükleme yapılıp yapılmayacağının korunmasının iyi olduğunu biliyorum, ancak bazı ilgili modellerde her zaman önceden yüklenmiş olarak ihtiyacınız var. Benim için fatura toplamları, önceden yüklenmemişse çalışmayan öğelerden hesaplanır. –

-1

Ben hızlı yoludur emin değilim, ama böyle, after_load geri arama kullanarak bunu sona erdi:

defmodule Invoice do 
    use Ecto.Model 

    after_load :preload_items 

    def preload_items(invoice) do 
    invoice |> Repo.preload([:items]) 
    end 
end 

Artık her zaman Fatura yüklendiği Başka bir şey tarafından önceden yüklenmiş olsa bile, ilişkili öğelerini önceden yükler.

Düzen - Bu

yerine sorguda ön yük koyun yapmayın. Yukarıdaki kodla 1000 fatura alındığında 1 + 1000 sorgu elde edilir. Sorgudaki önyük 0NE ekler. sorgu. 1 + 1 < 1000 + 1.

query = from c in Gadget, 
    #retrieve nested associations adds one query 
    preload: [invoices: :items] 
    select c 

Repo.all(query) 
+4

Bunu yapma. Bu, fatura başına bir sorgu yapar. Yani bir sorguda 10 fatura yüklerseniz, öğeleri yüklemek için 10 ayrı sorgu yapar. –

+0

Teşekkür ederim, bunun kötü olduğunu biliyordum, cevabın cevabı –

+1

Geri aramalar Elixir'den kaldırıldı – LukeS