2012-01-02 9 views
5

मैं जानना चाहता हूं कि रेल में कुशलतापूर्वक आदेश कैसे दिया जाए। हम सभी जानते हैं कि आप निम्न तरीकों के साथ रेल में सरल आदेश कर सकते हैं:रेल में कस्टम, कुशल, कॉम्प्लेक्स ऑर्डरिंग 3

Model.order("created_at ASC").limit(10) 

इस मामले में मैं सिर्फ पहले 10 प्रविष्टियों खींच रहा हूँ। अगर मैं एक गैर-समय चित्रित ऑर्डरिंग जोड़ना चाहता था तो मैं ऑब्जेक्ट ऑर्डर करने के लिए मॉडल (जैसे कस्टम_ऑर्डिंग कॉलम) और इनपुट मानों में एक कॉलम बना सकता था। उस मामले में आप ऑर्डर को संशोधित करेंगे ("कस्टम_ऑर्डिंग एएससी") कॉल।

लेकिन मान लें कि मैं उपयोगकर्ता की भविष्यवाणी की प्राथमिकता के आधार पर आदेश देना चाहता हूं। इस मामले में, एक नया कॉलम बनाने के लिए संभव नहीं है क्योंकि प्रत्येक उपयोगकर्ता के पास अलग-अलग स्वाद होते हैं। इस कार्य को पूरा करने के लिए एक स्मार्ट, कुशल तरीका क्या होगा?

मॉडल_rating (ऑब्जेक्ट) नामक मॉडल से किसी ऑब्जेक्ट की किसी उपयोगकर्ता की रेटिंग की भविष्यवाणी करने के लिए एक एल्गोरिदम बनाने का एक तरीका होगा। यह एल्गोरिदम अपनी रेटिंग के सकारात्मक पूर्णांक मान को थूक देगा। अगर मैं इस रास्ते से नीचे चला गया, तो मैं मॉडल को कुशलतापूर्वक कैसे आदेश दूंगा?

एक और तरीका एल्गोरिदम को model_entry.user_preference (उपयोगकर्ता) के रूप में सेट करना होगा। तब मैं द्वारा आदेश सकता है:

Model.all.sort! { |b, a| a.user_preference(user) <=> b.user_preference(user) } 

लेकिन यह मुझे अक्षम बनाता है। इसे मॉडल में सभी प्रविष्टियों को कॉल करना होगा और फिर उन्हें सॉर्ट करना होगा, भले ही आप मर्ज या बबल सॉर्ट जैसे कुशल सॉर्टिंग विधियों का उपयोग करें, बड़ी संख्या में प्रविष्टियों वाले मॉडलों पर खराब प्रदर्शन प्राप्त होता है।

क्या ऐसे कोई अन्य मार्ग हैं जिन पर मैं विचार नहीं कर रहा हूं? क्या कोई मुझे सही दिशा में इंगित कर सकता है?

उत्तर

0

इस समाधान में मुझे लगता है कि उपयोगकर्ता के पसंदीदा आदेश की गणना महंगी है और आप जिस सेट को ऑर्डर कर रहे हैं वह अक्सर अपडेट नहीं हो रहा है।

आप क्या कर सकते हैं हर बार आदेश (पृष्ठभूमि कार्य में) की गणना करें और प्रति उपयोगकर्ता एक अलग तालिका में गणना आदेश संग्रहित करें।

वैकल्पिक रूप से, यदि आपके पास बहुत से उपयोगकर्ता नहीं हैं, तो आप एक अलग तालिका में प्रति उपयोगकर्ता प्रत्येक मॉडल के स्कोर को सहेज सकते हैं, और उस मूल्य से जुड़ने में क्रमबद्ध कर सकते हैं। इन मूल्यों को नियमित आधार पर भी फिर से गणना की जा सकती है।

+0

हाँ, ये व्यवहार्य विकल्प प्रतीत होते हैं। क्या आपको लगता है कि इनमें से कोई भी दृष्टिकोण यह होगा कि फेसबुक जैसी बड़ी साइट न्यूज़फीड का आदेश कैसे देती है? इन मामलों में, आपके पास कई टेबल प्रविष्टियां और कई उपयोगकर्ता हैं। – jay

+0

फेसबुक के मामले में, मुझे लगता है कि वे प्रति व्यक्ति एक अलग न्यूजफीड स्टोर करते हैं। मुझे विश्वास नहीं है कि लोगों के बीच "कहानियां" साझा की जाती हैं। ये कहानियां साझा संसाधनों का उपयोग कर रही हैं (एल्बम, टिप्पणियां, आदि ...) लेकिन आपकी टाइमलाइन पर प्रत्येक कहानी आपके लिए बनाई गई है। (कम से कम, मैं इसे कैसे बनाऊंगा) –

+0

अच्छी तरह से, बहुत रोचक! दूसरों के साथ इस सामान पर चर्चा करने के लिए हमेशा प्रबुद्ध! आपके इनपुट – jay

0

बबल सॉर्ट कुशल नहीं है।

यदि आप एक मॉडल को सॉर्ट करने के बारे में बात कर रहे हैं, तो यह सच है कि सभी प्रकार के इनपुट उस मॉडल के गुण होंगे। यदि प्रत्येक उपयोगकर्ता अपनी तरह की पसंद वरीयता निर्दिष्ट कर सकता है, तो यह एक विशेषता या गुणों की एक सूची के लिए आता है। उस सूची को उपयोगकर्ता वरीयता के रूप में सहेजें, फिर गतिशील रूप से क्वेरी का निर्माण करें। बिल्ली, वास्तविक कोड को प्राथमिकता के रूप में सहेजें और उस पर एक eval करें।

लेकिन रिकॉर्ड की संख्या थ्रेसहोल्ड तक पहुंचने पर भी कुशल एसक्यूएल टूट जाती है। उस स्थिति में, आपको एक नया टूल चाहिए।

आप एक उचित खोज कार्यान्वयन का उपयोग कर सकते हैं, जिसमें मूल रूप से सॉर्टिंग शामिल है। मैं सनस्पॉट मणि के साथ सोलर का उपयोग करता हूं। और ऐसा लगता है कि स्पिंक्स सोच-स्फिंक्स मणि के साथ भी अच्छा कर्षण है।