2010-07-07 25 views
22

अगर मैं निम्नलिखित है,सीमा प्रत्येक कर पाश

<% @feed.sort_by{|t| - t.created_at.to_i}.each do |feed| %> 

<% end %> 

यह केवल करने के लिए सीमित कर सकते हैं कैसे दिखाने के 10 सबसे हाल के परिणाम

+3

आप क्यों नहीं बस प्रकार पहले और उसके बाद सरणी काट नहीं है पहले 10 पाने के लिए? –

उत्तर

60
<% @feed.sort_by{|t| - t.created_at.to_i}.first(10).each do |feed| %> 

हालांकि, यह है शायद इस

जैसे मॉडल में इसे धक्का देना सबसे अच्छा है
<% @feed.recent(10).each do |feed| %> 

और, वास्तव में, यदि @feed डेटाबेस से बाहर आता है, तो मैं इसे और भी नीचे दबा दूंगा: डीबी से बाहर की गई अनगिनत फ़ीड प्रविष्टियों को लोड करने के लिए यह समझ में नहीं आता है, फिर उन्हें सॉर्ट करें और फिर उनमें से ज्यादातर को फेंक दें। बेहतर डीबी सॉर्टिंग और फ़िल्टरिंग करने दें।

ActiveRecord में इसे करने के लिए @ पीयर एलन का उत्तर देखें। ARel में (IOW: रेल 3) यह शायद और भी आसान हो सकता है, जैसे

Feed.all.order('created_at DESC').take(10) 
+0

यदि मैं दो बार '@ फीड' का उपयोग करना चाहता हूं: एक दिखाने के लिए 10, दूसरा दिखाने के लिए, क्या यह मेरे लिए हालिया (10) 'के साथ इसे सीमित करने के लिए बेहतर है, फिर' @feed 'के लिए लूप के लिए अगला सामान्य '। – Victor

8

मैं (विशेष रूप से जोर्ग) अन्य लोगों के साथ सहमति व्यक्त करते हैं कुछ; लेकिन यदि आप अभी भी जानना चाहते हैं कि लूप को सीमित कैसे करें, break उपयोगी हो सकता है।

@array.each_with_index do |feed, i| 
    break if i == 10; 
    # ... 
+0

लूप को तोड़ने से, प्रदर्शित तत्वों की संख्या को सीमित करने के कई बेहतर तरीके हैं: 'पहला' और '[]' ऑपरेटर ऐसे परिदृश्य में बहुत अच्छी तरह से काम करता है। –

+0

मुझे "बेहतर" के बारे में पता नहीं है, लेकिन अन्य उत्तरों निश्चित रूप से अच्छे हैं, जिन्हें मैं विशेष रूप से इंगित करता हूं। "बेहतर" बहुत परिस्थितिपूर्ण है; मैं बता सकता हूं कि आपके द्वारा प्रस्तावित विधियों को एक नया सरणी बनाते हैं, जबकि मेरा नहीं। मुद्दा यह है कि, चूंकि अन्य उत्तरों ने संग्रह को सीमित करने पर पहले से ही ध्यान केंद्रित किया है, इसलिए मैंने केवल शाब्दिक प्रश्न का उत्तर दिया, एक और विकल्प जोड़ना: पूरे संग्रह पर लूप को पूर्ववत करना, केवल 10 गुना अधिकतम कैसे चलाना है। यह एक समाधान नहीं है जिसे मैं तब तक चुनूंगा जब तक कि मुझे समय के लिए दबाया न जाए, क्योंकि यह कोड को उलझन में डाल देता है। – Amadan

+0

हां यह ज्यादातर स्टाइल की बात है। लेकिन यदि प्रोग्रामर के इरादे को व्यक्त करने वाली प्रत्यक्ष अवधारणा है (जैसे 'पहले',' [] 'और 'ऑर्डर (...)। (10)' विशेष रूप से) मुझे व्यक्तिगत रूप से इसका उपयोग करने के लिए अधिक आकर्षक लगता है। –

5

बनाया गया यह इंगित करता है कि आप @feed चर सेट करने के लिए रेल में ActiveRecord का उपयोग कर रहे हैं। यदि ऐसा है तो आप SQL में यह काम करना बेहतर कर सकते हैं। इससे निपटने के लिए यह कहीं अधिक कुशल और आसान है।

@feed = Feed.all(:order => 'created_at DESC', :limit => 10) 

नहीं तो आप वास्तव में क्या करने के लिए इस आप पहली बार या एक सीमा का उपयोग कर सकते हैं दृश्य का उपयोग करना चाहते हैं तो

<% @feed.sort_by{|t| - t.created_at.to_i}[0..9].each do |feed| %> 
<% @feed.sort_by{|t| - t.created_at.to_i}.first(10).each do |feed| %> 
6

निम्नलिखित कोड 10 हाल के रिकॉर्ड वापस आ जाएगी।

@feed = @feed.sort! { |a,b| b.created_at <=> a.created_at }.take(10) 

Array Reference

+1

बहुत बढ़िया। यह आपको _after_ को क्रमबद्ध करने की अनुमति देता है।मेरे मामले में, मैं सबसे ज्यादा पॉलिमॉर्फिक संघों पर छंटनी कर रहा हूं। मैं इसके लिए एक प्रश्न नहीं लिख सकता (पता नहीं कैसे!)। यह अच्छी तरह से काम करता है। – mattd

9

मैं इसे इस तरह करना चाहते हैं:

<% @array.limit(10).each do |a| %>