/ / बेहतर तरीका यादृच्छिक करने के लिए (रूबी / रेल 3) [डुप्लिकेट]

यादृच्छिक करने के लिए बेहतर तरीका (रूबी / रेल 3) [डुप्लिकेट] - रूबी-ऑन-रेल, रूबी, रूबी-ऑन-रेल -3, एक्टिव्रेकॉर्ड, यादृच्छिक

मैं वर्तमान में उपयोग कर रहा हूँ:

@users = User.order ("RANDOM ()")। सीमा (6)

6 यादृच्छिक उपयोगकर्ताओं की सूची बनाने के लिए - हालाँकि, यह विधि पृष्ठ लोड समय पर 1200ms टोल लेती है। क्या 6 यादृच्छिक उपयोगकर्ताओं को कॉल करने का एक तेज़ / अधिक कुशल तरीका है?

उत्तर:

उत्तर № 1 के लिए 1

मैं यहाँ वर्णित विधि का उपयोग कर समाप्त हुआ: रेल यादृच्छिक रिकॉर्ड का चयन करती है

@ramc - आपकी टिप्पणी के लिए धन्यवाद। लोड समय अब ​​बहुत तेज है :)


जवाब के लिए 0 № 2

ऑटो इंक्रीमेंट आईडी मानकर, 0 से शुरू हो रहा है और उपयोगकर्ता ऑब्जेक्ट्स कभी भी डिलीट नहीं किए जाते हैं, निम्नलिखित काफी तेज होना चाहिए:

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


जवाब के लिए 0 № 3

क्या आपने एक यादृच्छिक ऑफसेट और सीमा का उपयोग करने की कोशिश की है?

class User < ActiveRecord::Base

def self.random num = 1
num.times.map { offset(rand(count)).limit(1) }
end

end

@users = User.random(6)

मैं एआर से एकल यादृच्छिक उदाहरण प्राप्त करने के लिए कुछ इसी तरह का उपयोग करता हूं। आपको अद्वितीय परिणाम की गारंटी देना चाहते हैं, तो आपको इसे थोड़ा चालाक बनाना होगा।


जवाब के लिए 0 № 4

आपको इसके बजाय उपयोगकर्ताओं का एक यादृच्छिक पृष्ठ मिल सकता है। इस पेजिंग कॉल का उपयोग करने पर विचार करें Kaminari

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

यह 6 उपयोगकर्ताओं के पेज के लिए एक गणना क्वेरी और एक क्वेरी को आग देगा


उत्तर के लिए -2 № 5

आप mysql यादृच्छिक का उपयोग करने के बजाय सरणी फेरबदल का उपयोग करने की कोशिश कर सकते हैं क्योंकि यह धीमा हो सकता है:

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

आखिरकार, ActiveRecord ऑब्जेक्ट्स का एक संग्रह अभी भी एक ऐरे है