6

खोज के थोड़ी देर के बाद, मैं अभी भी थोड़ा सा खो गया हूं। वहाँ कुछ अन्य समान प्रश्न हैं जो कई मॉडलों को पेजिंग करने से निपटते हैं, लेकिन वे या तो अनुत्तरित हैं या वे अलग-अलग मॉडल को अलग-अलग करते हैं।एकाधिक मॉडलों से रिकॉर्ड कैसे पगेट करें? (क्या मुझे पॉलिमॉर्फिक में शामिल होने की ज़रूरत है?)

मुझे एक बार में एक खाते के सभी रिकॉर्ड पेजगेट करने की आवश्यकता है।

class Account 
    :has_many :emails 
    :has_many :tasks 
    :has_many :notes 
end 

तो, मैं 30 सबसे हालिया "चीजें" ढूंढना चाहता हूं इससे कोई फर्क नहीं पड़ता कि वे क्या हैं। क्या यह वर्तमान अंकन समाधानों के साथ भी संभव है?

उत्सुक लोडिंग और कामिनरी या will_paginate के कुछ संयोजन का उपयोग करने की तरह?


या, मैं पहली बार एक बहुरूपी इन सब बातों, बुलाया आइटम के शामिल होने की स्थापना करनी चाहिए। फिर सबसे हालिया 30 वस्तुओं को पगनेट करें, फिर उन वस्तुओं के संबंधित रिकॉर्ड का एक लुकअप करें।

और यदि ऐसा है, तो मुझे सच में यकीन नहीं है कि वह कोड कैसा दिखना चाहिए। कोई सुझाव?


किस तरह से बेहतर है? (या यहां तक ​​कि संभव)

रेल 3.1, रूबी 1.9.2, ऐप उत्पादन में नहीं है।

+0

Will_paginate का उपयोग करें, वें मदद करनी चाहिए: http://stackoverflow.com/questions/1465949/how-to-use-will-paginate-with-a-nested-resource-in-rails –

+0

धन्यवाद। लेकिन, यह वह नहीं है जिसे मैं ढूंढ रहा हूं। – GoodGets

+0

एक डेटाबेस तालिका की एकाधिक पंक्तियों के माध्यम से पेजिंग के बजाय "डेटा की पंक्तियों के एक सेट के माध्यम से पेजिंग" सोचने में मदद मिल सकती है। इससे कोई फ़र्क नहीं पड़ता कि डेटा कितने मॉडल से आया था। आप यह देखने के लिए किमिनिनिरी को भी देखना चाहते हैं कि यह आपकी आवश्यकताओं को बेहतर तरीके से पूरा करता है या नहीं। –

उत्तर

1

अच्छा सवाल है ... मैं एक "अच्छा" समाधान के बारे में सुनिश्चित नहीं कर रहा हूँ, लेकिन आप माणिक में एक hacky एक कर सकता है:

आप पहली बार बाहर लाने के लिए प्रत्येक प्रकार के 30 नवीनतम आवश्यकता होगी "बात", और उन्हें एक सरणी, created_at द्वारा अनुक्रमित में डाल दिया है, तो created_at द्वारा कि सरणी सॉर्ट और शीर्ष 30

एक लेने की तरह कुछ पूरी तरह से गैर पुनर्संशोधित शुरू हो सकता है:

emails = Account.emails.all(:limit => 30, :order => :created_at) 
tasks = Account.tasks.all(:limit => 30, :order => :created_at) 
notes = Account.notes.all(:limit => 30, :order => :created_at) 
thing_array = (emails + tasks + notes).map {|thing| [thing.created_at, thing] } 
# sort by the first item of each array (== the date) 
thing_array_sorted = thing_array.sort_by {|a,b| a[0] <=> b[0] } 
# then just grab the top thirty 
things_to_show = thing_array_sorted.slice(0,30) 

नोट : परीक्षण नहीं किया गया, बग से भरा हो सकता है ...;)

+0

आपके उत्तर के लिए धन्यवाद। हालांकि, यह हर बार 60 अतिरिक्त रिकॉर्ड लाने के लिए बहुत ही अपरिवर्तनीय होगा। फिर ट्रैक रखने के लिए प्रत्येक में से कितने प्रस्तुत किए गए थे। साथ ही, आप चीज़_एरे को कुछ ऐसा करने के लिए दोबारा प्रतिक्रिया दी जा सकती है जैसे: '(ईमेल + कार्य + नोट्स) .sort_by (&: update_at) .take (30)' – GoodGets

+0

सबसे हालिया प्राप्त करने के लिए रिवर्स की आवश्यकता है: '(ईमेल + कार्य + नोट्स) .sort_by (&: update_at) .reverse.take (30) ' – GoodGets

+0

हाँ - निश्चित रूप से अप्रत्याशित ... जैसा कि मैंने कहा - बस एक हैकी समाधान :) –

2

will_paginate साथ:

current_page = params[:page] || 1 
per_page = 10 
@records = WillPaginate::Collection.create(current_page, per_page, records.size) do |pager| 
pager.replace(@records) 
end 

तो अपने ध्यान में रखते हुए:

@records = #do your work and fetch array of records you want to paginate (various types) 

तो निम्नलिखित करें

<%=will_paginate @records%> 
0
emails = account.emails 
tasks = account.tasks 
notes = account.notes 

@records = [emails + tasks + notes].flatten.sort_by(&:updated_at).reverse 

@records = WillPaginate::Collection.create(params[:page] || 1, 30, @records.size) do |pager| 
    pager.replace(@records) 
end 

Thats यह ... :)

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