2011-06-09 22 views
5

का अंतिम दस्तावेज़ प्राप्त करना मैं MongoDB के साथ काम करने के लिए Mongoid का उपयोग कर रहा हूं। सब ठीक है, मुझे यह बहुत पसंद है और इसी तरह। मेरे ब्लॉग आवेदन में (पदों नियंत्रक, सूचकांक कार्रवाई) मैं इस कोड है:सीमित Mongoid क्वेरी परिणाम और .count()

@posts = Post.without(:comments) 
@posts = @posts.my_search(params[:s]) if params[:s] 
@posts = @posts.order_by([:created_at, :desc]) 
@posts = @posts.where(:pid.lt => params[:p].to_i+1) if params[:p] 
@posts = @posts.limit(items_per_page+1) 

साथ "कहाँ" मेरे अपने पृष्ठांकन विधि के क्रियान्वयन है हिस्सा (केवल एक दिशा में पेज परिणामों के लिए अनुमति देता है, लेकिन skip() बिना, मैं एक प्लस पर विचार करता हूं)। अब, कुछ छोटी समस्याएं हैं जो मुझे असहज महसूस करती हैं:

काम करने के लिए मेरे पेजिनेशन के लिए मुझे उस सीमा के भीतर अंतिम पोस्ट प्राप्त करने की आवश्यकता है। लेकिन जब मैं @posts.last करता हूं तो मुझे बिना किसी सीमा के पूरे प्रश्न का अंतिम दस्तावेज़ मिल रहा है। ठीक है, यह अजीब है, लेकिन एक बड़ी समस्या नहीं है। उसके अलावा, क्वेरी परिणाम, लगभग साधारण सरणी की तरह काम करते तो इस समय मैं @posts.pop साथ पिछले तत्व हो रही है (अजीब है, लेकिन यह किसी भी दस्तावेज को दूर नहीं करता है) या @posts.fetch(-1)

मुझे लगता है कि यह "सही रास्ता" नहीं है और वहां कुछ और सुरुचिपूर्ण हो सकता है। इसके अलावा @posts.count दूसरी क्वेरी को बिल्कुल पहले (बिना सीमा के) के समान बनाता है लेकिन केवल "गिनती" के साथ और मुझे यह पसंद नहीं है।

अगर मैं अंतिम पंक्ति देखो की तरह

@posts = @posts.limit(items_per_page+1).to_ary 

सरणी में क्वेरी परिणाम कन्वर्ट करने के लिए बनाने के लिए, सब कुछ केवल एक क्वेरी (अच्छा) उत्पन्न करता है, लेकिन अब @posts.count बंद हो जाता है रिपोर्टिंग क्या मैं सीमा के बिना की जरूरत है (दस्तावेजों की कुल राशि लागू) और @posts.size की तरह व्यवहार करता है - यह items_per_page+1 या कम (खराब) देता है।

तो, यहाँ मेरी प्रश्न हैं:

1) एक 'सही' ने ले ली सीमा के भीतर क्वेरी परिणामों के अंतिम दस्तावेज प्राप्त करने के लिए क्या है?

2) अतिरिक्त क्वेरी उत्पन्न किए बिना दी गई शर्तों के साथ कुल दस्तावेजों को कैसे प्राप्त करें?

युपीडी:

3) @ posts.first अतिरिक्त क्वेरी, यह कैसे को रोकने के लिए और बस से पहले मैं सभी दस्तावेजों पुनरावृति पहला दस्तावेज प्राप्त उत्पन्न करता है?

Post.last 

कुछ अन्य प्रश्नों के साथ पिछले दस्तावेज़ हो रही है:

Post.order_by([:created_at, :desc]).last 

हो रही कुल संख्या दस्तावेज:

Post.order_by([:created_at, :desc]).count 

सिफ़ारिश: बस में बनाया का उपयोग

उत्तर

3

पिछले दस्तावेज़ हो रही है अंकन

@posts = Post.limit(10).paginate(:page=>pararms[:page]) 

बाद में:

<%= will_paginate @posts %> 
अतिरिक्त प्रश्नों के बारे में

- mongoid आलसी लोड सब कुछ:

@posts = Post.all #no query has been run yet 
@posts.first #Ok, a query has finally been run because you are accessing the objects 
+0

आप सवालों का जवाब दे रहे हैं मैं नहीं पूछा :) .limit जोड़े (2) से पहले .last और देखें कि यह कैसा व्यवहार करेगा। इसके अलावा। गणना अतिरिक्त क्वेरी उत्पन्न करती है और मैं पूछ रहा हूं कि इससे कैसे बचें। मैंने will_paginate और kaminari को हटा दिया क्योंकि मुझे छोड़ना पसंद नहीं है() और यह भी क्योंकि वे इंडेक्स एक्शन में विशिष्ट पोस्ट पर "कूद" करने की अनुमति नहीं देते हैं। इसके अलावा, @ पोस्ट.एच के बाद @ पोस्ट.एच के साथ फिर से प्रयास करने का प्रयास करें, आपको दो प्रश्न दिखाई देंगे। –

+0

यदि आप केवल एक प्रश्न चाहते हैं, तो आपको सब कुछ एक सरणी में धक्का देना होगा। @posts = post.whatever.all.to_a ... फिर @ पोस्ट.फर्स्ट और @ पोस्ट.लास्ट रूबी एन्यूमेरेटर विधियां होंगी और मोंगोइड कमांड नहीं होंगे। –

+0

हां, मैंने इसके बारे में मेरे प्रश्न में लिखा है, लेकिन @ posts.count अतिरिक्त क्वेरी उत्पन्न करता है यदि मैं इसे to_ary से पहले करता हूं, और यह केवल सीमित राशि देता है यदि मैं इसे बाद में करता हूं। क्या सीमा() से पहले प्रश्न करने और परिणामों में गिनती करने का कोई तरीका है? –

संबंधित मुद्दे