6

Trovo che quando uso i serializzatori ActiveModel per generare JSON per un insieme di modelli che includono associazioni, si ottengono un sacco di query SQL (una per ciascuna associazione). Come posso evitare questo?Come evitare più chiamate SQL nei serializzatori ActiveModel?

Ho cercato di fare un include nel controller:

render json: Project.includes(tasks: [:workers]) 

ma questo non sembra funzionare. Anche se passo la relazione (con include) direttamente a ArraySerializer, non aiuta.

+0

Se si potesse pubblicare il tuo intero isolato respond_to, e il contenuto risultante del registro, che sarebbe utile. – mysmallidea

risposta

-1

Sono passato a rabl. controllo più granulare e migliore

0

Prova istanziare un serializzatore te stesso:

@projects = Project.includes(tasks: [:workers]) 
render json: ActiveModel::ArraySerializer.new(@projects, each_serializer: ProjectSerializer).to_json 
1

E 'un po' radicale, ma per le query complesse che venivano colpiti molto mi sono trasferito tutta la generazione JSON nella query di database (Sto usando Postgres 9.3 che supporta questo). Probabilmente non è la soluzione più pulita in quanto ha bisogno di SQL abbastanza grezzo ma è veloce.

Aggiornerò con un esempio se qualcuno è interessato.

0

Ho trovato che utilizzare include nel controller ha funzionato per me, ma devi stare attento che il tuo oggetto serializzatore non include le relazioni che non sono inclusi.

Inoltre ho trovato se si specifica una relazione uno-a-uno, come

has_one :country, embed: :ids, include: false 

che preleverà l'altro oggetto, anche se non ha bisogno di. Invece ho sostituito con:

attributes :country_id 

sto utilizzando Active Modello Serializer v0.8.3