Ich habe vergessen, :batch_size
zu verwenden, aber Chandra schlug vor. Das ist der richtige Weg.
.all
verwendet, wird der Datenbank bitten alle Datensätze abzurufen, um sie zu Rubin vorbei dann über sie intern laufen zu halten. Das ist ein wirklich schlechter Weg, damit umzugehen, wenn Ihre Datenbank wächst. Das liegt daran, dass der Globe von Records den DBM mit zunehmendem Wachstum härter arbeiten lässt und Ruby mehr und mehr Speicherplatz zuweisen muss, um sie zu halten. Ihre Reaktionszeit wird dadurch wachsen.
Eine bessere Lösung ist die Verwendung der Optionen :limit
und :offset
, um dem DBM mitzuteilen, nacheinander die ersten 1000 Datensätze bei Offset 0, dann die nächsten 1000 Datensätze bei Offset 1 usw. zu finden. Schleifen solange, bis keine Datensätze mehr vorhanden sind.
Sie können bestimmen, wie oft Sie eine Schleife machen müssen, indem Sie eine .count
vor der Nachfrage, die wirklich schnell ist, wenn Ihre Where-Klausel ist scheußlich, oder einfach Schleife, bis Sie keine Datensätze zurück.
Ruby oder Schienen? Wenn dies von einer Datenbank kommt, möchten Sie vielleicht nicht sofort 'all()' in den Speicher ziehen. – Ken
Wie wäre es mit Ihrer Akzeptanzbewertung? 53% sind niedrig in Anbetracht Ihres guten Rufs. –