限制每个do循环

时间:2010-07-07 02:06:04

标签: ruby-on-rails ruby loops

如果我有以下内容,

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

<% end %>

如何限制它仅显示10个最新结果

6 个答案:

答案 0 :(得分:62)

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

然而,最好将其推向像这样的模型

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

事实上,如果@feed来自数据库,我会进一步推迟它:从数据库中加载大量未分类的订阅源条目是没有意义的,然后排序他们然后扔掉他们中的大部分。最好让DB进行排序和过滤。

请参阅@Peer Allan关于如何在ActiveRecord中完成此操作的答案。在ARel(IOW:Rails 3)中,它可能更简单,类似于

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

答案 1 :(得分:20)

Array#first(n)

[1,2,3,4,5].first(3)
=> [1,2,3]

答案 2 :(得分:11)

我会这样做:

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

答案 3 :(得分:8)

我同意其他人(特别是Jörg);但如果您仍想知道如何限制循环本身,break可能会有用。

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

答案 4 :(得分:6)

以下代码将返回10条最近的记录。

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

Array Reference

答案 5 :(得分: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| %>