2009-08-25 11 views
0

Angenommen, ich habe ein Post- und Kategoriemodell, wobei jeder Beitrag zu einer Kategorie gehört. Auf so ziemlich jeder Seite, bekomme ich die Liste der Kategorien:Rails: Entfernen unnötiger Datenbankabfragen

Dies erzeugt ein Array von Category-Objekten. Nun sagen Sie, dass jede Kategorie ID- und Namensattribute hat. Beim Anzeigen eines Posts möchte ich den Kategorienamen anzeigen.

Ich war ursprünglich immer die Kategorienamen durch so etwas wie dies zu tun:

@post = Post.find(params[:id], :include => :category) 

Aber ich weiß, dass ich schon die @categories Array. Es scheint unnötig zu sein: einzuschließen, wenn ich bereits eine Liste von Kategorien habe. Stattdessen führe ich jetzt eine Suche auf dem Array aus:

Dies funktioniert und reduziert die Anzahl der Abfragen. Meine Frage ist, ob dies der beste Weg ist, die Anzahl der Abfragen zu reduzieren (ohne Caching)?

Antwort

2

Das ist vollkommen vernünftig.

Das einzige Risiko (und es ist ein winziges) ist, dass Sie möglicherweise einer Race Condition unterliegen. Zum Beispiel könnte jemand die Kategorie des Beitrags ändern, nachdem Sie die Kategorienliste abgerufen haben, oder sie könnten die Liste der Kategorien aktualisieren, und was Sie zeigen, wäre nicht mehr korrekt. Wenn sie dann, zum Beispiel, auf einen Kategorienamen geklickt haben, um eine Liste aller Beiträge mit dieser Kategorie zu erhalten, erhalten sie wahrscheinlich einen Fehler, es sei denn, Sie haben damit zu tun gehabt.

IMO, das ist ein sehr kleiner Preis, aber zu zahlen.

+0

guten Punkt. unf. keine Stimmen übrig :) –

1

Das einzige Problem hier wäre, wenn Sie entscheiden, dass Sie die Kategorieliste nicht mehr benötigen und versuchen Sie es zu entfernen.

Sonst hast du eine gute Lösung.

0

Und was ist, wenn Sie eine große Anzahl von Kategorien haben? Wirst du sie immer noch holen? Doing a :include ist viel besser, da SQL Ruby immer gewinnen wird.

+0

Ich sehe nur ein Maximum von sagen ... 20 Kategorien. Ich werde immer diese Kategorien holen müssen. – Homar

Verwandte Themen