限制Rails中的"每个"列表

Vic*_*tor 16 ruby-on-rails

我们有这个:

<% @shops.each do |shop| %>
  <li><%= shop.name %></li>
<% end %>
Run Code Online (Sandbox Code Playgroud)

代码将产生50个条目的总结果(在我的情况下).

如何将此视图限制为20?是的,只是限制它,我不想要任何分页或什么.

谢谢.

Rac*_*lit 31

更改控制器中@shops设置的代码,或将上面的代码更改为@shops.take(20).each.


Mik*_*wis 19

我强烈建议使用您的数据库来限制结果.这样做更有效率,因为您的数据库正在执行此工作(它旨在执行此操作)并且您不会检索所有结果然后过滤它们.想象一下,如果你有100万个结果,你问你的数据库......不是很理想.

你想做的事情:

Shop.limit(20)
Run Code Online (Sandbox Code Playgroud)

哪个让数据库完成工作而不是Ruby.

快速基准测试(评论表仅包含487个结果!):

ruby-1.9.2-p136 :033 > Benchmark.ms do
ruby-1.9.2-p136 :034 >     Comment.all.take(20)
ruby-1.9.2-p136 :035?>   end
 => 649.461030960083 
ruby-1.9.2-p136 :036 > Benchmark.ms do
ruby-1.9.2-p136 :037 >     Comment.limit(20)
ruby-1.9.2-p136 :038?>   end
 => 0.1506805419921875 
Run Code Online (Sandbox Code Playgroud)

〜4,300倍差!

或者即使您的论点是您返回了少量结果,这里还有另一个基准:

ruby-1.9.2-p136 :041 > Benchmark.ms do
ruby-1.9.2-p136 :042 >     Comment.limit(50).take(20)
ruby-1.9.2-p136 :043?>   end
 => 410.9840393066406 
ruby-1.9.2-p136 :044 > Benchmark.ms do
ruby-1.9.2-p136 :045 >     Comment.limit(20)
ruby-1.9.2-p136 :046?>   end
 => 0.05412101745605469 
Run Code Online (Sandbox Code Playgroud)


fl0*_*00r 10

limit在你的ActiveRecord级别(或SQL)上

@shops = Shop.limit(20)        # Rails 3+
@shops = Shop.all :limit => 10 # Rails 2+
Run Code Online (Sandbox Code Playgroud)

或者使用Ruby

<% @shops[0,20].each do |shop| %>
  <li><%= shop.name %></li>
<% end %>
Run Code Online (Sandbox Code Playgroud)