2012-12-06 7 views
15

के साथ रिवर्स पेजिनेशन मैं मैसेजिंग सिस्टम के लिए पेजिनेशन बनाना चाहता हूं जिसमें दिखाए गए पहले पृष्ठ में सबसे पुराने संदेश हैं, जिसके बाद वाले पेज नए संदेश दिखा रहे हैं।कामिनरी

उदाहरण के लिए, यदि प्रति पृष्ठ 3 के साथ {a,b,c,d,e,f,g,h,i} के लिए सामान्य पृष्ठांकन है:

{a,b,c}, {d,e,f}, {g,h,i} 

फिर रिवर्स पृष्ठांकन होगा:

{g,h,i}, {d,e,f}, {a,b,c} 

मैं पृष्ठों पहले जोड़ें ताकि परिणाम एक ही है की योजना सामान्य पेजिनेशन के रूप में, केवल अंतिम पृष्ठ से शुरू होता है।

क्या यह kaminari के साथ संभव है?

+0

आप रिवर्स किए गए डेटासेट को केवल पैगनेट क्यों नहीं करते? 'YourModel.order (" बनाया गया एएससी ")। पृष्ठ'? – thomasfedb

उत्तर

0

हां, लेकिन जिस विधि के साथ मैं आया हूं वह बिल्कुल सुंदर नहीं है। प्रभावी ढंग से, आप अपने खुद के आदेश सेट करने के लिए:

Message.page(1).per(3).order("created_at DESC").reverse! 

इस दृष्टिकोण के साथ समस्या दोहरा है:

पहले रिवर्स! कॉल एरे के दायरे को हल करता है और क्वेरी करता है, एआर स्कॉप्स का उपयोग करके कामिनारी के कुछ भयानक पहलुओं को झुकाता है।

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

एक वैकल्पिक दृष्टिकोण "पिछले" पृष्ठ संख्या पूछताछ और हल करने के लिए इस समस्या को होगा अपने पृष्ठ संख्या की ओर 1.

+0

कुछ ऐसा: 'पृष्ठ = संदेश.count% 3; Message.page (पेज - i) .per (3) .order ("बनाया गया डीईएससी") '? – Trompa

+0

'ऑर्डर ("बनाया गया डीईएससी") को छोड़कर' ऑर्डर ("बनाया गया एएससी" होना चाहिए) यदि आप उस दृष्टिकोण के साथ जा रहे हैं। –

1

एक तरह से नीचे बढ़ाने के लिए किया जाएगा यह एक: Reverse pagination with kaminari? यह बहुत साफ नहीं लगती है न ही इष्टतम, लेकिन यह काम करता है :)

2

गीथूब पर reverse_kaminari नामक गीथब पर एक अच्छा उदाहरण रेपो है। यह (Source) इन लाइनों के साथ कार्यान्वयन का सुझाव देता है।

class CitiesController < ApplicationController 

    def index 
    @cities = prepare_cities City.order('created_at DESC') 
    end 

    private 

    def prepare_cities(scope) 
    @per_page = City.default_per_page 
    total_count = scope.count 
    rest_count = total_count > @per_page ? (total_count % @per_page) : 0 
    @num_pages = total_count > @per_page ? (total_count/@per_page) : 1 

    if params[:page] 
     offset = params[:page].sub(/-.*/, '').to_i 
     current_page = @num_pages - (offset - 1)/@per_page 
     scope.page(current_page).per(@per_page).padding(rest_count) 
    else 
     scope.page(1).per(@per_page + rest_count) 
    end 
    end 

end 

सभी क्रेडिट Andrew Djoga पर जाते हैं। उन्होंने ऐप को a working demo के रूप में भी होस्ट किया।

1

Kaminary.paginate_array ऑफसेट और सीमा के साथ क्वेरी उत्पन्न नहीं करता है। अनुकूलन कारण के लिए, आपको इसका उपयोग नहीं करना चाहिए।

इसके बजाय आप यह कर सकते हैं:

@messages = query_for_message.order('created_at DESC').page(params[:page]).per(3) 

कहाँ है जो आप पृष्ठांकन के लिए रिकॉर्ड को पुनः प्राप्त करने का उपयोग किसी भी प्रश्न के लिए query_for_message खड़ा है। उदाहरण के लिए, यह एक विशेष बातचीत के सभी संदेश हो सकता है।

अब दृश्य फ़ाइल में, आपको केवल @messages को रिवर्स ऑर्डर में प्रदर्शित करने की आवश्यकता है। उदाहरण के लिए:

<%= render :collection => @messages.reverse, :partial => 'message' %> 
<%= paginate @messages %>