2015-04-12 12 views
14

Esiste un modo per precaricare le associazioni ecto senza utilizzare esplicitamente il precarico :?Precaricamento delle associazioni Ecto per impostazione predefinita

Qualcosa come un'opzione nello schema?

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

che sto facendo qualcosa di simile

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

Edit: la ragione per cui sto cercando di fare questo è perché voglio precaricare un modello relativo al modello legati già precaricato, come

preload: [:invoices preload: :items] 

risposta

29

Si può anche precaricare come parte di una query:

defmodule Gadget do 
    use Ecto.Model 

    # ... 

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

Poi:

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

C'è qualche ragione per cui non è un'opzione nello schema? So che è bello conservare l'opzione se eseguire il precaricamento o meno durante l'interrogazione, ma per alcuni modelli correlati è sempre necessario precaricare. Sulla mia, i totali delle fatture sono calcolati dagli articoli, che non funzioneranno se non sono precaricati. –

-1

io non sono sicuro che è il modo più veloce, ma ho finito per fare questo usando il callback after_load, in questo modo:

defmodule Invoice do 
    use Ecto.Model 

    after_load :preload_items 

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

Ora, ogni volta che viene caricato fattura , anche se è precaricato da qualcos'altro, precaricherà i suoi elementi associati.

Modifica - Non fare questo

Mettere i precarichi nella query, invece. il recupero di 1000 fatture con il codice sopra comporterà 1 + 1000 query. il precarico nella query aggiunge 0NE. query. 1 + 1 < 1000 + 1.

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

Repo.all(query) 
+4

Non farlo. Questo farà una richiesta per fattura. Quindi, se carichi 10 fatture in una query, eseguirà 10 query separate per caricare gli articoli. –

+0

Grazie, sapevo che non andava bene, risposta sopra modificata –

+1

Le richiamate sono state rimosse dall'elisir – LukeS

Problemi correlati