2011-03-17 13 views
7

तो, मेरे ऐप में संग्रह से संबंधित फ़ोटो हैं। मैं एक पृष्ठ पर एक विशिष्ट संग्रह से 13 तस्वीरें दिखाने में सक्षम होना चाहता हूं।रेल: यादृच्छिक रिकॉर्ड की एक विशिष्ट संख्या प्राप्त करें

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

यह काम करता है, एक तरह से:

मैं इस कोशिश की। समस्या यह है कि, अगर संग्रह में 13 से अधिक फ़ोटो नहीं हैं तो यह आवश्यक रूप से 13 फ़ोटो वापस नहीं करता है। मुझे विशेष रूप से बिल्कुल 13 तस्वीरें प्राप्त करने की आवश्यकता है।

FWIW मेरे ऐप के मामले में संग्रह केवल व्यवस्थापक/मोड द्वारा बनाया गया है, इसलिए हम यह लागू कर सकते हैं कि किसी भी संग्रह में 13 से कम फ़ोटो नहीं होंगी। मुझे जो चाहिए वह 13 से अधिक बार एक बार यादृच्छिक फ़ोटो का चयन शुरू करने में सक्षम होना है।

मैं यह कैसे कर सकता हूं?

उत्तर

13

आप पहले 13 यादृच्छिक जुड़े फोटो आईडी चुन सकते हैं, तो उन्हें लाने के लिए है एक डेटाबेस क्वेरी:

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

आपकी टिप्पणी "13 तक तक की फोटो" कहती है, क्या यह वास्तव में 13 फ़ोटो लौटाएगी? यदि यह कम लौटाता है तो मैं इसका उपयोग नहीं कर सकता। – Andrew

+0

ठीक है, अगर संग्रह में 13 फोटो_आईड्स से कम है तो यह 13 फ़ोटो वापस नहीं कर सकता है। अन्यथा, हाँ, यह करता है। –

+0

ठीक है, इसका परीक्षण किया और यह अच्छी तरह से काम करता है, धन्यवाद! – Andrew

6

बस उन्हें बेतरतीब ढंग से सॉर्ट एसक्यूएल में और ले पहले 13 ऐसा:

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

SQLite और PostgreSQL में यह काम करता है:

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 
नियंत्रक में

? मैं एसक्यूएल के साथ बहुत अच्छा नहीं हूं लेकिन एसक्यूएल मतभेदों के कारण मुझे अपने विकास और उत्पादन वातावरण के बीच अतीत में समस्याएं आई हैं। – Andrew

+0

आप हमेशा कोशिश कर सकते हैं और पता लगा सकते हैं। मुझे यकीन है कि अधिकांश एसक्यूएल कार्यान्वयन में 'रैंड() 'काम करता है। – tadman

+4

हालांकि देखें क्योंकि यह अविश्वसनीय रूप से अक्षम है और बड़े डेटासेट पर निष्पादित करने के लिए आवश्यक से अधिक समय लगेगा। – nzifnab

-1

यहां एक त्वरित समाधान है .. वर्तमान में 1.5 मिलियन से अधिक रिकॉर्ड और सभ्य प्रदर्शन प्राप्त करने के साथ इसका उपयोग कर रहा है। सबसे अच्छा समाधान एक या अधिक यादृच्छिक रिकॉर्ड सेट को कैश करना होगा, और उसके बाद वांछित अंतराल पर पृष्ठभूमि कार्यकर्ता के साथ उन्हें रीफ्रेश करना होगा।

बनाया random_records_helper.rb फ़ाइल:

@users = User.where(id: random_user_ids(10)) 
संबंधित मुद्दे