2017-07-26 1 views
0

Ich habe folgende Modelle bekam Meine RequestsController Ich nehme die Anfragen mit ihren hub_posts und und dann eine JSON-Antwort (ich verwende active_model_serializers 0.10.4 mit dem :json Adapter) wie folgt:Hinzufügen umfassen Argument Methode machen nicht beheben N + 1 Abfrage

Dies ist natürlich ein offensichtliches N + 1-Problem (das das Bullet-Juwel überraschenderweise nicht aufzugreifen scheint). Wenn ich die Protokolle anschaue, kann ich eine SELECT Erklärung für jede hub_post sehen. Jetzt habe ich versucht, einschließlich likes wie so:

requests = current_contact.requests.includes(hub_post: [:contact, :likes]) 
requests = current_contact.requests.includes(hub_post: [contact: [:likes]]) 

Interessant ist, dass das Bullet Juwel nicht auf das N nicht abholen + 1, noch Scout tut.

Ich habe auch versucht, gemäß den documentation ein include Argument meiner Render-Methode hinzufügen, etwa so:

respond_to do |format| 
    format.json { render json: requests, include: 'hub_posts,hub_posts.likes', each_serializer: PortalRequestSerializer, scope: current_contact } 
end 

Ich versuchte auch, wie so einstufig und Multi-Level-Wildcards:

respond_to do |format| 
    format.json { render json: requests, include: '*', each_serializer: PortalRequestSerializer, scope: current_contact } 
end 

respond_to do |format| 
    format.json { render json: requests, include: '**', each_serializer: PortalRequestSerializer, scope: current_contact } 
end 

Aber nichts, was ich tue, scheint das N + 1 zu beseitigen. Ich bin mir nicht sicher, ob dies ein Problem damit ist, wie das Juwel die Beziehungen in verschachtelten Serialisierern behandelt oder ob ich gerade etwas verpasse.

UPDATE

Hier ist eine gist der Abfrage von dem Server-Protokoll.

Antwort

0

Es scheint mir, dass Sie Ihre includes Aussage von

requests = current_contact.requests.includes(hub_post: [:contact]) 

zu

requests = current_contact.requests.includes(:hub_post, :contact) 
+0

Nein. Versuchte dies, tat nichts für mich. – ACIDSTEALTH

+0

Ich denke, da ist etwas Verwirrung. Ist es "likes", dass du das N + 1-Problem hast, oder "hub_posts" und "contacts"? –

+0

Mit Blick auf Ihre Assoziationen, ich bin nicht ganz sicher, warum Sie versuchen, "Kontakte" unter 'hub_posts' ('Anfragen = current_contact.requests.includes (Hub_post: [: Kontakt,: likes]))') wenn 'Anfragen 'sind direkt mit' contacts' verbunden und 'hub_posts' sind nicht –

0

ich Ihre Anfrage Modell-ID von current_contact zu speichern hat contact_id annehmen ändern sollten, so können Sie versuchen:

request = Request.where(contact_id: current_contact.id).includes(:contact, { hub_post: :likes }) 
+0

Dies hat nichts für die N + 1 Problem. Ich habe jede Variante der Platzierung von ': Likes' in der' includes' Anweisung versucht, aber nichts funktioniert. – ACIDSTEALTH

+0

zeigen Sie bitte Ihre Logs an. – Thanh

+0

Bearbeitet meine Frage oben mit einem Link (Ende des Beitrags) zu einem Kern der Protokolle. – ACIDSTEALTH

Verwandte Themen