限制每个do循环

Kar*_*tle 23 ruby loops ruby-on-rails

如果我有以下,

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

<% end %>
Run Code Online (Sandbox Code Playgroud)

如何限制它只显示最近的10个结果

Jör*_*tag 62

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

但是,最好将其推向像这样的模型

<% @feed.recent(10).each do |feed| %>
Run Code Online (Sandbox Code Playgroud)

而且,事实上,如果@feed从数据库出来,我会进一步推迟它:从数据库中加载大量未分类的提要条目,然后对它们进行排序,然后将其中的大部分丢弃是没有意义的.最好让DB进行排序和过滤.

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

Feed.all.order('created_at DESC').take(10)
Run Code Online (Sandbox Code Playgroud)


ale*_*mur 11

我这样做:

<% @array.limit(10).each do |a| %>
Run Code Online (Sandbox Code Playgroud)


Ama*_*dan 8

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

@array.each_with_index do |feed, i|
  break if i == 10;
  # ...
Run Code Online (Sandbox Code Playgroud)


Ome*_*lam 6

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

@feed = @feed.sort! { |a,b| b.created_at <=> a.created_at }.take(10)
Run Code Online (Sandbox Code Playgroud)

数组参考


Pee*_*lan 5

created_at似乎表明您在Rails中使用ActiveRecord来设置@feed变量.如果是这种情况,您最好在SQL中完成这项工作.它更有效,更容易处理.

@feed = Feed.all(:order => 'created_at DESC', :limit => 10)
Run Code Online (Sandbox Code Playgroud)

否则,如果您真的想使用视图执行此操作,则可以使用first或range

<% @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| %> 
Run Code Online (Sandbox Code Playgroud)