2009-07-07 12 views
7

सुंदर लगता है कि मैं वास्तव में यहाँ सरल कुछ याद कर रहा हूँ:का उपयोग will_paginate

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

मैं mislav-will_paginate का उपयोग कर रहा हूं, और यह सोच रहा था कि क्या इसे प्राप्त करने का कोई बेहतर तरीका है? कुछ ऐसा:

[Profile, Group].paginate(...) 

आदर्श होगा!

उत्तर

6

अच्छा सवाल, मैं एक ही समस्या में दो बार भाग गया। प्रत्येक बार, मैंने एसक्यूएल यूनियनों के आधार पर अपनी स्वयं की एसक्यूएल क्वेरी लिखकर इसे समाप्त कर दिया (यह स्क्लाइट और माइस्क्ल के साथ ठीक काम करता है)। फिर, आप परिणामों को पारित करके अंकन (http://www.pathf.com/blogs/2008/06/how-to-use-will_paginate-with-non-activerecord-collectionarray/) का उपयोग कर सकते हैं। सभी पंक्तियों को गिनने के लिए क्वेरी निष्पादित करना न भूलें।

कोड में से कुछ लाइनें (परीक्षण नहीं)

my_query = "(select posts.title from posts) UNIONS (select profiles.name from profiles)" 
total_entries = ActiveRecord::Base.connection.execute("select count(*) as count from (#{my_query})").first['count'].to_i 

results = ActiveRecord::Base.connection.select_rows("select * from (#{my_query}) limit #{limit} offset #{offset}") 

यह overkilled है? हो सकता है लेकिन आपके पास कम से कम प्रश्न हैं और परिणाम सुसंगत हैं।

उम्मीद है कि यह मदद करता है।

नोट: (यानी: एसक्यूएल इंजेक्शन ....) आप एक http परम से ऑफसेट मूल्य प्राप्त हैं, तो आप sanitize_sql_for_conditions का उपयोग करना चाहिए एकाधिक पृष्ठ पर अंक लगाना करने के लिए

0

क्या आपने परिणामों के दो अलग-अलग सेट अपने स्वयं के पेजिनेटर के साथ प्रदर्शित करने और AJAX के माध्यम से अपडेट करने का प्रयास किया है? यह वही नहीं है जो आप चाहते हैं, लेकिन परिणाम समान है।

+0

दुर्भाग्यवश यह कटौती नहीं करेगा - मुझे एक साथ उदाहरणों के दो सेट होने की आवश्यकता है। – Codebeef

1

आप पास की तरह कुछ कर रही प्राप्त कर सकते हैं:

@profiles, @groups = [Profile, Group].map do |clazz| 
    clazz.paginate(:page => params[clazz.to_s.downcase + "_page"], :order => 'name') 
end 

यही तो का उपयोग कर पृष्ठ मानकों profile_page और group_page पृष्ठ पर अंक लगाना होगा। फिर भी

<%= will_paginate @profiles, :page_param => 'profile_page' %> 
.... 
<%= will_paginate @groups, :page_param => 'group_page' %> 

, मैं वहाँ व्यक्तिगत रूप से @groups और @profiles की स्थापना पर एक बहुत बड़ा लाभ है यकीन नहीं है: आप का उपयोग कर सही पृष्ठ का उपयोग करने के विचार में will_paginate कॉल प्राप्त कर सकते हैं।

1
मेरा आखिरी परियोजना मैं एक समस्या में फंस में

, मैं था मेरी खोज कार्यक्षमता में एकल अंकन के साथ मॉडल। इसे इस तरह से काम करना चाहिए कि पहले मॉडल को पहले मॉडल के परिणाम पहले दिखाना चाहिए जब दूसरे मॉडल के परिणाम परिणामों को जारी रखना चाहिए और तीसरा और एक ही खोज फ़ीड के रूप में, जैसे कि फेसबुक फ़ीड की तरह। इस समारोह मैं इस कार्यक्षमता

def multi_paginate(models, page, per_page) 

    WillPaginate::Collection.create(page, per_page) do |pager| 

    # set total entries 
    pager.total_entries = 0 
    counts = [0] 
    offsets = [] 
    for model in models 
      pager.total_entries += model.count 
      counts << model.count 
      offset = pager.offset-(offsets[-1] || 0) 
      offset = offset>model.count ? model.count : offset 
      offsets << (offset<0 ? 0 : offset) 
    end 

    result = [] 
    for i in 0...models.count 
      result += models[i].limit(pager.per_page-result.length).offset(offsets[i]).to_a 
    end 

    pager.replace(result) 
    end 

end 

यह कोशिश करते हैं और मुझे पता है आप इसके साथ किसी भी समस्या है, तो जाने क्या करने के लिए बनाया है, मैं भी यह एक मुद्दे के रूप में भंडार will_paginate करने के लिए, पोस्ट अगर हर कोई पुष्टि की है कि इसे सही ढंग से काम करता है मैं कांटा और पुस्तकालय में प्रतिबद्ध हूँ। https://github.com/mislav/will_paginate/issues/351

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