Frage

Auf Ruby on Rails, sagen wir, wenn die Schauspieler Modellobjekt Tom Hanks ist, und die "has_many" Fans ist 20.000 Fan-Objekte, dann

actor.fans

gibt ein Array mit 20.000 Elementen. Wahrscheinlich werden die Elemente nicht mit den Werten vorzunehmen bevölkert? Ansonsten von der DB extrem Zeit kann jeden Akteur Objekt immer raubend.

So ist es auf Basis ist "need to know"?

So ist es Daten ziehen, wenn ich actor.fans zugreifen [500] und Daten ziehen, wenn ich actor.fans Zugriff auf [0]? Wenn sie aus jedem Datensatz zu Datensatz springt, dann wird es nicht zu optimieren die Leistung der Lage sein, durch sequentielle Lese tun, die auf der Festplatte schneller sein kann, weil die Datensätze in der nahen gelegenen Sektor / platte Schicht sein könnte - zum Beispiel, wenn das Programm berührt 2 zufällige Elemente, dann wird es schneller sein, nur diese zwei Datensätze zu lesen, aber was, wenn es alle Elemente in zufälliger Reihenfolge berührt, dann kann es schneller sein, nur alle Datensätze in einer sequentiellen Art und Weise zu lesen und verarbeitet dann den Zufall Elemente. Aber wie wird RoR wissen, ob ich nur ein paar zufälligen Elemente oder alle Elemente in zufälligen tue?

War es hilfreich?

Lösung

Warum wollen Sie 50000 Datensätze holen, wenn Sie nur 2 von ihnen benutzen? Fetch werden nur die zwei aus der DB. Wenn Sie die Fans auflisten möchten, dann werden Sie wahrscheinlich Paginierung verwenden - d. H Nutzgrenze und in der Abfrage Offset oder einige Paginierung Juwel wie will_paginate

Ich sehe keine logische Erklärung, warum Sie den Weg zu gehen, sollten Sie versuchen. Erklären Sie eine reale Situation so konnten wir Ihnen helfen.

Allerdings gibt es eine denken, Sie brauchen wile Laden viele zugehörige Objekte von DB wissen - Verwendung: include wie

Actor.all(:include => :fans)

Dies wird eifrig Last alle Fans so wird es nur zwei Abfragen anstelle von N + 1, wobei N eine Menge von Akteuren ist

Andere Tipps

Sehen Sie in der SQL, die durch den Server im Entwicklungsmodus ausgespuckt wird, und das wird Ihnen sagen, wie viele Fan Datensätze geladen werden. In diesem Fall actor.fans wird in der Tat dazu führen, sie alle geladen werden, was wahrscheinlich nicht das, was Sie wollen.

Sie haben mehrere Möglichkeiten:

  • Verwenden Sie ein paginator wie durch Tadas vorgeschlagen;
  • Einrichten einer anderen Verbindung mit dem Tischventilatoren, dass zieht in nur die, die Sie interessieren. Dies entweder mit Bedingungen auf der has_many Aussage gemacht werden kann, beispielsweise
    has_many :fans, :conditions => "country of residence = 'UK'"
  • Die Angabe der vollständigen SQL die Zeilen mit der Option :finder_sql zurück zu verengen
  • Die Angabe der :limit Option, die wird gut, zu begrenzen, die Anzahl der Zeilen zurückgegeben.

Alles hängt davon ab, was Sie tun wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top