2010-07-07 60 views
22

如果我有以下,限制每個做循環

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

<% end %> 

怎麼能限制它,只顯示最近10個結果

+3

你爲什麼不只是排序第一,然後切片的陣列,以獲得前10? – 2010-07-07 02:07:44

回答

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

然而,這可能最好把這個推到像這樣的模型

<% @feed.recent(10).each do |feed| %> 

而且,事實上,如果@feed出來一個數據庫,我會進一步推下來:它沒有意義加載大量的未分類的Feed條目了DB的,然後對它們進行排序和然後將其中的大部分扔掉。最好讓數據庫進行排序和篩選。

請參閱@Peer Allan的回答如何在ActiveRecord中做到這一點。在ARel(IOW:Rails 3中),它可能會更簡單,像

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

如果我想使用'@ feed'兩次:一個顯示10,另一個顯示所有,對我來說用'recent(10)'來限制它是否更好,然後下一個正常的用於'@feed的循環'。 – Victor 2011-08-17 05:16:22

8

我與其他人同意(約爾格尤其是);但如果你仍然想知道如何限制循環本身,break可以是有用的。

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

限制顯示元素數量的方法要比打破循環要好得多:在這種情況下,「first」和「[]'操作符工作得很好。 – 2012-03-05 14:41:51

+0

我不知道「更好」,但其他答案當然更好,我特別指出。 「更好」是非常情景化的;我可能會指出你提出的方法創建了一個新的陣列,而我的方法卻沒有。關鍵是,由於其他答案已經集中在限制集合本身,所以我只回答了字面問題,增加了另一個選項:預設整個集合的循環,如何僅運行最多10次。這不是我選擇的解決方案,除非我時間緊迫,因爲它確實使代碼更醜陋。 – Amadan 2012-03-06 06:16:21

+0

是的,它主要是風格問題。但是,如果有直接的概念表達程序員的意圖(比如'first','[]'和'order(...)。特別是(10)'),我個人覺得使用它更有吸引力。 – 2012-03-06 10:47:56

5

的created_at似乎表明,你在Rails中使用ActiveRecord來獲得設置@feed變量。如果是這種情況,最好在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 2012-04-10 12:15:56

9

我會做這樣的:

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