2009-07-30 8 views
2

Comment obtenir un enregistrement aléatoire lors de l'utilisation de: groupe?Rails, Obtenez un enregistrement aléatoire lors de l'utilisation: groupe

@paintings = Painting.all(:group => "user_id", :order => "created_at DESC") 

Ceci me donne la dernière peinture pour chaque utilisateur. Maintenant, je voudrais sélectionner une peinture aléatoire de chaque utilisateur au lieu de la dernière. L'ordre des peintures doit toujours être le même, de sorte que l'utilisateur qui a été le plus actif affichera sa peinture au hasard en premier.

painting150 (user1)
painting200 (utilisateur2)
painting231 (user3)

Est-ce possible?

Cordialement. Asbjørn Morell.

Répondre

1

Cette réponse est spécifique à Rails, mais puisque vous utilisez ActiveRecord, je suis ssumant ça devrait aller.

unique_paintings = [] 
@paintings.group_by(&:user_id).each do |user_id, paintings| 
    unique_paintings << paintings[rand(paintings.size-1)] 
end 

unique_paintings.sort_by(&:created_at) 

Le group_by certainement bousille le genre created_at vous avez fait dans la requête, donc je l'ai fait une sort_by comme la dernière étape. Vous pourriez vouloir vous en débarrasser dans la requête puisque vous devrez le faire de toute façon ici.

0
@painting = @paintings[rand(@paintings.size-1)] 

(ou paintings.count, ne connaissez pas la bonne méthode encore)

+0

Devrais-je l'utiliser à mon avis? – atmorell

+2

Cet exemple ne renvoie qu'une image aléatoire ... Même si @paintings contient 100 enregistrements. – atmorell

0

En supposant que vous avez MySQL, vous pouvez essayer:

@paintings = Painting.all(:group => "user_id", :order => "RAND()") 
+0

Cela renvoie toujours le même enregistrement pour chaque utilisateur, mais dans un ordre aléatoire:/Je dois retourner une peinture aléatoire pour chaque utilisateur. – atmorell

0

vous pourriez faire quelque chose comme ça, mais il va souffrir lorsque votre nombre d'enregistrements augmente

@paintings = Painting.find(:all, :order => 'RAND()').map{ |i| i.user_id }.uniq 
+0

Hmmm il semble que votre exemple renvoie l'identifiant de l'utilisateur pour la dernière peinture. >> @paintings = Painting.all.map {| i | i.user_id} .uniq Peinture Charge (46.6ms) SELECT * FROM 'peintures' => [3, 4, 5, 6, 7, 8, 9, 10] – atmorell

Questions connexes