Ограничить "каждый" список в Rails

Мы имеем это:

<% @shops.each do |shop| %>
  <li><%= shop.name %></li>
<% end %>

Код даст итоговый результат из 50 записей (в моем случае).

Как ограничить это представление до 20? Да, просто ограничьте это, я не хочу разбиения на страницы и что.

Спасибо.

Ответы

Ответ 1

Измените код в контроллере, где установлен @shops, или измените приведенный выше код на @shops.take(20).each.

Ответ 2

Я бы предложил использовать вашу базу данных для ограничения результатов. Это намного эффективнее в том, что ваша база данных выполняет эту работу (она предназначена для этого). И вы не извлекаете все свои результаты, а затем фильтруете их. Представьте, если у вас было 1 миллион результатов, которые вы просили в своей базе данных... не очень желательно.

Вы хотите сделать:

Shop.limit(20)

У чего есть база данных, выполняющая работу, а не 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 

~ В 4300 раз хуже!

Или даже если ваш аргумент состоит в том, что вы получили небольшое количество результатов, вот еще один тест:

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 

Ответ 3

Просто limit он на вашем уровне ActiveRecord (или SQL)

@shops = Shop.limit(20)        # Rails 3+
@shops = Shop.all :limit => 10 # Rails 2+

Или используйте Ruby

<% @shops[0,20].each do |shop| %>
  <li><%= shop.name %></li>
<% end %>