Ich verwende derzeit:
@users = User.order ("RANDOM ()"). limit (6)
Um eine Liste mit 6 zufälligen Benutzern zu erstellen, erfordert diese Methode eine Gebühr von 1200 ms für die Ladezeiten der Seite. Gibt es eine schnellere / effizientere Möglichkeit, 6 zufällige Benutzer anzurufen?
Antworten:
1 für die Antwort № 1Ich habe die hier beschriebene Methode verwendet: Rails wählen einen zufälligen Datensatz
@ramc - Vielen Dank für Ihren Kommentar. Ladezeiten sind jetzt viel schneller :)
0 für die Antwort № 2
Unter der Annahme von Auto-Inkrement-IDs, die von 0 ausgehen und Benutzerobjekte niemals gelöscht werden, sollte Folgendes sehr schnell sein:
@users = (0..5).map { User.find(rand * User.count) }
0 für die Antwort № 3
Haben Sie es mit einem zufälligen Offset & Limit versucht?
class User < ActiveRecord::Base
def self.random num = 1
num.times.map { offset(rand(count)).limit(1) }
end
end
@users = User.random(6)
Ich habe etwas Ähnliches verwendet, um einzelne zufällige Instanzen von AR zu erhalten. Sie müssen es etwas intelligenter machen, wenn Sie einzigartige Ergebnisse garantieren möchten.
0 für die Antwort № 4
Sie könnten stattdessen eine zufällige Seite von Benutzern erhalten. Betrachten Sie diesen Seitenaufruf mit Kaminari
User.order("created_at").page(rand(User.count)).per(6)
Dadurch werden eine Zählerabfrage und eine Abfrage für die Seite mit 6 Benutzern ausgelöst
-2 für die Antwort № 5
Sie können versuchen, Array-Shuffle anstelle von mysql random zu verwenden, da dies langsam sein kann:
@users = User.all.shuffle[0..5]
Immerhin ist eine Sammlung von ActiveRecord-Objekten nur ein Array