5

Ich habe ein User Modell.Eager loading mit has_many durch

Ein user hat viele integrations.

Ein integration wird ein profile über integration_profiles verbinden, die eine Spalte data enthalten.

Ich möchte eifrig laden alle Benutzerprofile.

class Integration < ActiveRecord::Base 
has_many :integration_profiles 
has_many :profiles, through: :integration_profiles 
end 

class IntegrationProfile < ActiveRecord::Base 
belongs_to :integration 
belongs_to :profile 
end 

class Profile < ActiveRecord::Base 
has_many :integration_profiles 
has_many :integrations, through: :integration_profiles 
end 

Ich versuchte dies: using enthält oder schließt sich

all = User.first.integrations.includes(:profiles) 

Aber ich, wenn ich tat all.count

=> 2 

Aber wenn ich

tun
all = User.first.integrations.joins(:profiles) 
all.count 
=> the correct total 

Sollte ich? Ich habe immer verwendet wird, schließt also nicht sicher, warum dies nicht funktioniert hier

Antwort

3

Wenn Sie das tun

all = User.first.integrations.joins(:profiles) 
all.count 

die Integrationen Aufzeichnungen würden zum ersten User und mit einer inneren Join-Abfrage auf profiles gezählt werden.

Und wenn Sie

all = User.first.integrations.includes(:profiles) 
all.count 

wieder tun bekommen Sie Integrationen zählen, aber ohne Abfrage mit Profilen kommen als Profile eifrig geladen mit separaten Abfragen sind wegen includes

Es scheint, dass man einfach die profiles Zählung wollen zu einem gegebenen user zugeordnet. Der beste Weg, dies zu erreichen wäre, eine Assoziation zwischen User und Profile Modell

User ==> has_many :profiles, through: :integration

erstellen Wenn Sie das tun, Sie direkt User.first.profiles.count Zugriff auf die Anzahl aller zugehörigen Profile eines bestimmten Benutzers zu erhalten.

Die andere Option wäre (wenn Sie nicht mit obiger Option gehen wollen), alle integrations durchzuschleifen und alle profiles.count für jede Integration zusammenzufassen.

Wählen Sie die Option, die Ihren Anforderungen am besten entspricht.

+0

hi @KirtiThorat, wie könnte ich rückwärts gehen und das gemeinsame Modell aufrufen oder auswählen, das Integrationen und Profile verbindet? –

0

Abfrage 1

all = User.first.integrations.includes(:profiles)

all.count ist Anzahl der Integrationen Rückkehr und nicht die von Profil. Profil wird eifrig geladen.

Wenn Sie die Anzahl der Profile wissen möchten, muss dies auf diese Weise geschehen.

ar = [ ] 

all.each do |a| 
    ar << a.profiles.count 
end 

ar.reduce(:+) erhalten Sie die gleiche Zählung geben, wenn Sie Abfrage 2.

Abfrage 2

all = User.first.integrations.joins(:profiles)

all.count

Bei Abfrage 2, seine Rückkehr Sie Integrationen ausführen aus der Tabelle integration_profiles.

Select users from users limit 1;

Select integrations from integrations INNER JOIN integration_profiles on integration_profiles.integration_id = integrations.id where integrations.user_id = 'id of user'

mehr wissen, über sie 2.

.to_sql auf Abfrage 1 und Query aufrufen Wenn Sie von eifrigen Laden tun wollen, dann schließt die bevorzugte Option.

+0

Okay, ich möchte gerne eifrig laden, so dass ich 'User.first.profiles' aufrufen kann, wie kann ich so eifrig laden? –

Verwandte Themen