2010-07-07 85 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| %>