2011-06-19 7 views
4

Je suis actuellement en utilisant:meilleure façon de Randomisez (Ruby/Rails 3)

@users = User.order ("random()") limite (6)

à. générer une liste de 6 utilisateurs aléatoires - cependant, cette méthode prend un impact de 1200ms sur les temps de chargement de la page. Existe-t-il un moyen plus rapide/efficace d'appeler 6 utilisateurs aléatoires?

+0

Quelque chose comme http://stackoverflow.com/questions/2279706/select-random-row-from-an-sqlite-table/4740561#4740561? – captainpete

+1

avez-vous considéré ceci: http://stackoverflow.com/questions/3641057/rails-select-random-record/3641112#3641112 – dexter

Répondre

1

j'ai fini avec la méthode décrite ici: Rails select random record

@ramc - Merci pour votre commentaire. Les temps de chargement sont maintenant beaucoup plus rapide :)

-2

Vous pouvez essayer d'utiliser shuffle tableau au lieu d'utiliser MySQL au hasard car il peut être lent:

@users = User.all.shuffle[0..5] 

Après tout, une collection d'objets ActiveRecord est encore juste un tableau

+0

Ce code est valable, mais les temps de chargement sont les mêmes. :( – neon

+0

Cette charge également toute la collection de l'utilisateur - la performance va empirer comme le nombre d'enregistrements d'utilisateurs augmente – theTRON

+0

Charger la collection n'est pas quelque chose que vous voulez faire, si la base de données, il ne vous aurez pas besoin de chercher toutes les lignes.. – Schmurfy

0

En supposant ids incrémentation automatique, à partir de 0 et que les objets de l'utilisateur ne sont jamais supprimés, ce qui suit devrait être assez rapide:

@users = (0..5).map { User.find(rand * User.count) }

+0

En outre, il serait plus rapide de mettre en cache le résultat de User.count. – Redbeard

0

H avez-vous essayé d'utiliser une limite de décalage aléatoire &? J'ai utilisé quelque chose de similaire pour obtenir des instances aléatoires uniques à partir de AR. Vous deviez le rendre un peu plus intelligent si vous vouliez garantir des résultats uniques.

0

Vous pouvez obtenir une page au hasard des utilisateurs à la place. Considérez cet appel en page en utilisant Kaminari

User.order('created_at').page(rand(User.count)).per(6) 

Ce sera le feu d'un chef requête et une requête pour la page de 6 utilisateurs