Warum werden einzelne SELECT-Abfragen ausgeführt, wenn bereits ein allumfassendes SELECT ausgeführt wurde? (Schienen / ActiveRecord)

8

Ich habe den folgenden Code (beachten Sie includes und .each ):

%Vor%

Entsprechend sehe ich in meinen Protokollen Folgendes (d. h. select * from ROSTER_INFO ... IN (...) ):

%Vor%

Gleich danach gibt es select * from ROSTER_INFO für jede ID, die bereits in der IN Liste der vorherigen Abfrage angegeben wurde:

%Vor%

Wenn select * bereits auf ROSTER_INFO für alle IDs von Interesse ( IN (...) ) ausgeführt wurde, warum wird dann für jede der gleichen IDs erneut ein select * ausgeführt? Kennt ActiveRecord bereits nicht alle ROSTER_INFO -Spalten für jede ID?

(Zwischenzeitlich gibt es keine individuellen Abfragen für ROSTER_CONTACT , aber wenn ich :roster_contact von der Methode includes entferne, wird ROSTER_INFO nicht erneut abgefragt, aber ROSTER_CONTACT ist.)

RosterInfo-Modell (gekürzt)

%Vor%

RosterContact-Modell (gekürzt)

%Vor%

RosterWeb-Modell (gekürzt)

%Vor%

Mailgroup-Modell (abgekürzt)

%Vor%

MailgroupMember-Modell (abgekürzt)

%Vor%     
user664833 23.10.2012, 20:56
quelle

3 Antworten

1

Es stellte sich heraus, dass das Problem mit m.roster_contact.member_name zusammenhängt - leider habe ich member_name zu einer Methode von roster_contact gemacht, die (indirekt) roster_info.member_name abgefragt hat. Ich habe das gelöst, indem ich die Zeile

geändert habe %Vor%

um roster_info wie folgt direkt abzufragen

%Vor%

Es tut mir leid für die Probleme!

    
user664833 31.10.2012, 20:26
quelle
0

Ich werde meinen Hals herausstrecken und sagen, dass dies wahrscheinlich eine In-Flight-Optimierung durch Ihre Suchmaschine ist. Das 'IN' wird normalerweise verwendet, um große Mengen von Schlüsseln zu vergleichen. Die effizienteste Möglichkeit, drei Schlüssel aufzulösen (vorausgesetzt, ID ist der Schlüssel), würde darin bestehen, jede Zeile nach Schlüssel abzurufen, wie es geschehen ist.

    
MikeAinOz 31.10.2012 10:29
quelle
0
%Vor%

Ich weiß nicht, was die Voraussetzung für bidirektionales has_one ist, aber ich vermute, dass es schlecht ausgehen wird. Wahrscheinlich ändern Sie einen von ihnen in belongs_to . Machen Sie dasselbe für die anderen bidirektionalen has_one Assoziationen.

Eine andere Sache ist, dass Sie 'ID' für die foreign_key-Spalte verwenden, wobei die übliche Vorgehensweise roster_contact_id oder die Klasse ist, auf die Sie verweisen.

Bearbeiten:

Bei näherer Betrachtung sehen RosterInfo , RosterContact , RosterWeb wie separate Tabellen für einen einzelnen Datensatz aus, da sie alle den gleichen Satz von gegenseitigen has_one Assoziationen haben . Dies ist etwas, das auf der Schema-Ebene behandelt werden sollte, aber momentan sollten Sie in der Lage sein, die Assoziationen has_one von eins der drei Modelle zu löschen, um Ihr unmittelbares Problem zu lösen.

    
prusswan 31.10.2012 16:18
quelle