2011-03-17 22 views
7

Uygulamamın Koleksiyona ait Fotoğraflar var. Bir sayfada belirli bir koleksiyondan 13 fotoğraf gösterebilmek istiyorum. Bu tür işleriRaylar: belirli bir rasgele kayıt sayısı elde edin

c = Collection.first 
@photos = c.photos.offset(rand(c.photos.count)).limit(13) 

:

Bu çalıştı. Sorun, koleksiyonun 13 fotoğraftan fazla olmaması durumunda, mutlaka 13 fotoğraf döndürmez. Özellikle tam olarak 13 fotoğraf almam gerekiyor.

FWIW Uygulamamın bir Koleksiyonunda yalnızca Koleksiyon/yönetici tarafından oluşturulan koleksiyonda, hiçbir koleksiyonun 13'ten az fotoğrafa sahip olamayacağını söyleyebiliriz. İhtiyacım olan şey, 13'ten fazla kez rastgele seçilmiş fotoğrafların seçimini yapmaya başlayabilmektir.

Bunu nasıl yapabilirim?

cevap

13

Önce 13 rasgele ilişkili fotoğraf kimlikleri seçebilir, daha sonra bir veritabanı sorgusu onları getirmesi yapın:

c = Collection.first 
random_ids = c.photo_ids.sort_by { rand }.slice(0, 13) 
@photos = Photo.where(:id => random_ids) 
+0

Yorumunuz "13 fotoğrafa kadar" yazıyor, bu dönüş EXACTLY 13 fotoğraf mı olacak? Daha az döndürürse kullanamam. – Andrew

+0

Koleksiyonda 13'ten az foto_id varsa 13 fotoğraf döndüremez. Aksi halde evet. –

+0

Tamam, bunu test ettik ve iyi çalışıyor, teşekkürler! – Andrew

6

Sadece sql rastgele sıralamak ve ilk 13. bunu atın:

c.photos.order("RAND()").limit(13) 
+0

SQLite ve PostgreSQL bu çalışıyor mu: Kontrol ünitesinde

module RandomRecordsHelper def random_user_ids(n) user_ids = [] user_count = User.count n.times{user_ids << rand(1..user_count)} return user_ids end 

? SQL ile çok iyi değilim ama SQL farklılıkları nedeniyle geliştirme ve üretim ortamları arasında geçmişte sorunlar yaşadım. – Andrew

+0

Her zaman deneyebilir ve öğrenebilirsiniz. Eminim ki 'RAND()' çoğu SQL uygulamasında çalışır. – tadman

+4

Dikkatle INCREDIBLY verimsiz ve daha büyük veri kümeleri yürütmek için gerekenden daha uzun sürecek çünkü. – nzifnab

-1

İşte hızlı bir çözüm ... Şu anda 1,5 milyondan fazla kayıt ve iyi bir performans elde ederek kullanıyor. En iyi çözüm, bir veya daha fazla rasgele kayıt kümesini önbelleğe almak ve daha sonra istediğiniz bir aralıkta arka plan işçisiyle yenilemek olacaktır.

düzenlendi random_records_helper.rb dosyası:

@users = User.where(id: random_user_ids(10)) 
İlgili konular