Alors, mon application a des photos qui appartiennent à des collections. Je veux pouvoir montrer 13 photos d'une collection spécifique sur une page.
J'ai essayé ceci: p> Ceci fonctionne, en quelque sorte. Le problème est que si la collection n'a pas beaucoup plus de photos de 13 photos, cela ne renvoie pas nécessairement 13 photos. J'ai besoin de préciser exactement 13 photos. P> FWIW Dans le cas de mon application, une collection est créée uniquement par des administrateurs / mods, afin que nous puissions appliquer qu'aucune collection n'aura moins de 13 photos. Ce dont j'ai besoin, c'est de pouvoir commencer à sélectionner des photos aléatoires une fois de plus de 13 sont disponibles. P> Comment pourrais-je faire cela? P> P>
3 Réponses :
Triez-les juste au hasard dans SQL et prenez le premier 13. DO:
c.photos.order("RAND()").limit(13)
Est-ce que cela fonctionne dans SQLite et PostgreSQL? Je ne suis pas très bon avec SQL mais j'ai eu des problèmes dans le passé entre mes environnements de développement et de production en raison de différences SQL.
Vous pouvez toujours essayer de le découvrir. Je suis sûr que rand () code> fonctionne dans la plupart des implémentations SQL.
Regardez cependant parce qu'il est incroyablement inefficace et sur des ensembles de données plus importants prendront beaucoup plus de temps que nécessaire pour exécuter.
Postgres et SQLite3 utilisent 'aléatoire ()'. Ceci est spécifique à la base de données.
Ceci est apparemment extrêmement lent.
Vous pouvez d'abord sélectionner 13 identifiants photo associés au hasard, puis effectuez une requête de base de données pour les récupérer:
c = Collection.first random_ids = c.photo_ids.sort_by { rand }.slice(0, 13) @photos = Photo.where(:id => random_ids)
Votre commentaire dit "jusqu'à 13 photos", cela reviendra-t-il exactement 13 photos? Je ne peux pas l'utiliser s'il revient moins.
Eh bien, il ne peut pas retourner 13 photos si la collection a moins de 13 photo_ids. Sinon, oui, ça fait.
Voici une solution rapide .. Utilisez-le actuellement avec plus de 1,5 million d'enregistrements et obtenir des performances décentes. La meilleure solution serait de mettre en cache un ou plusieurs ensembles d'enregistrements aléatoires, puis rafraîchissez-les avec un ouvrier d'arrière-plan à l'intervalle souhaité.
créé aléatoire_records_helper.rb code> fichier: p>
@users = User.where(id: random_user_ids(10))