2016-07-27 32 views
1

Ich habe folgendes Setup: Firma has_many: Standorte Ort belongs_to: FirmaRails .includes nicht Verband Rückkehr

Als ich nennen Company.includes (: locations), erhalte ich die Firma wieder zurück, aber keiner der verbundenen Standorte.

Irgendwelche Ideen werden geschätzt!

+0

Wenn Sie nur ein einziges Unternehmen zu holen und wollen es Orte zu laden, müssen Sie nicht 'includes' verwenden. Das Ausführen von @company = Company.find (params [: id]) 'gefolgt von' @ company.locations' führt genauso viele Abfragen aus wie '@company = Company.includes (: locations) .find (params [: id]) ' –

Antwort

1

Eager zu durchlaufen Eager Laden ist notwendig, da es die Leistung Ihrer Anwendung optimiert und verhindern, dass Ihr System in N + 1 Abfrageproblem ausführen. Angenommen, Sie haben 3000 Firmen in Ihrer Datenbank, dann wird Ihre Datenbank mit 3000 + 1 Anfragen überschwemmt. So in der Steuerung können Sie es erreichen, wie

@companies = Company.includes(:locations) 

Ähnliches gilt für einzelne Unternehmen können Sie es tun, wie

@company = Company.includes(:locations).find(params[:id]) 

Nun werden Stellen mit Spannung geladen und Sie können sie als

holen
@companies.collect{ |company| company.locations } 

ODER

@company.locations 

Hinweis: Sie können einen beliebigen Iterator verwenden. Ich habe "Collect" nur zum Zwecke der Ausarbeitung verwendet. Danke

1

Ich bin mir nicht sicher, was Sie mit einem Unternehmen zu tun versuchen, aber wenn Sie ein Unternehmen wollen und es Orte, die Sie im Allgemeinen die folgenden Schritte aus würde:

class Company 
    has_many :locations 
end 

class Location 
    belongs_to :company 
end 

class CompaniesController < ApplicationController 
    def show 
    @company = Company.find(params[:id]) 
    @locations = @company.locations 
    end 
end 

Dann in Ihrem show Ansicht, würden Sie Rufen Sie @locations.each do |location|, um über die Liste von locations

0

Ich stieß auf dieses Problem, als ich versuchte, die Daten von meiner Frage als JSON zurückzusenden.

@companies = Company.includes(:locations) render :json => @companies.to_json(:include => [:locations])

für mich gearbeitet :)