6

Ich finde, dass wenn ich ActiveModel Serializers verwenden, um JSON für eine Reihe von Modellen zu generieren, die Zuordnungen enthalten, führt es zu einer Tonne von SQL-Abfragen (eine für jede Zuordnung). Wie kann ich das vermeiden?Wie vermeidet man mehrere SQL-Aufrufe in ActiveModel-Serialisierer?

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

Aber das scheint nicht zu funktionieren: eine Include zu tun in der Steuerung

Ich habe versucht. Selbst wenn ich die Beziehung (mit Includes) direkt an ArraySerializer übergebe, hilft das nicht.

+0

bin mit Wenn Sie Ihren gesamten respond_to Block, und der resultierende Inhalt Ihrer Log posten könnte, wäre das hilfreich sein. – mysmallidea

Antwort

-1

Ich wechselte zu rabl. mehr granulare und bessere Kontrolle

0

versuchen, einen Serializer selbst instanziieren:

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

Es ist ein bisschen radikal, aber für komplexe Abfragen, die eine Menge getroffen wurden ich die ganze JSON Generation in die Datenbankabfrage bewegt (Ich benutze Postgres 9.3, das unterstützt). Es ist wahrscheinlich nicht die sauberste Lösung, da es ziemlich rohes SQL benötigt, aber es ist schnell.

Ich werde mit einem Beispiel aktualisieren, wenn jemand interessiert ist.

0

Ich fand die Verwendung von Includes im Controller für mich gearbeitet, aber Sie müssen vorsichtig sein, dass Ihr Serializer-Objekt keine Beziehungen enthält, die nicht in den Includes enthalten sind.

Auch fand ich, wenn Sie eine Eins-zu-Eins-Beziehung wie

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

geben sie das andere Objekt holen werden, auch wenn es nicht benötigt. Stattdessen ersetzte ich es mit:

attributes :country_id 

I Aktives Modell Serializer v0.8.3