2011-04-11 7 views
15

tenemos esto:límite "cada una" lista de rieles

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

El código producirá el resultado total de 50 entradas (en mi caso).

¿Cómo puedo limitar esta vista a 20? Sí, solo limítelo, no quiero paginación o qué.

Gracias.

+1

esa sustancia procedente de una base de datos? Entonces simplemente limítalo allí usando ActiveRecord. – halfdan

+0

En realidad es un resultado de búsqueda de esfinge. Lo configuré como 50 por página, porque quiero mostrar 50 marcadores de Google Maps, pero en la lista, quiero mostrar solo 20. – Victor

Respuesta

29

Cambie el código en su controlador donde se está estableciendo @shops, o cambie el código anterior a @shops.take(20).each.

+0

Uso '@ shops.take (20) .each' en su lugar, porque necesito 50 resultados en otro lugar en la misma página. ¡Gracias! – Victor

+0

Supongamos que tiene una asociación user.post y desea tener una página de índice que solo muestra una publicación de cada usuario. ¿Cómo limitarías allí? Algo como <% posts.user_id.limit (1) .each do | user | %>? Cualquier ayuda es muy apreciada :) –

10

Sólo limit en su nivel de ActiveRecord (o SQL)

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

O utilice Rubí

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

La tuya también. ¡Gracias! – Victor

18

te sugeriría altamente utilizando su base de datos para limitar los resultados. Esto es mucho más eficiente porque su base de datos está haciendo el trabajo (está diseñada para hacer esto) Y usted no está recuperando todos sus resultados y luego filtrándolos. Imagínese si tuviera 1 millón de resultados que le pidió a su base de datos para ... no muy deseable.

Lo que quiere hacer:

Shop.limit(20) 

que tiene la base de datos haciendo el trabajo en lugar de Ruby.

Una prueba de referencia rápida (tabla sólo contiene 487 Comentarios resultados!): Peor

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 veces!

O incluso si su argumento es que usted tiene una pequeña cantidad de resultados devueltos, aquí es otro punto de referencia:

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 
+0

Muchas gracias por su investigación. En realidad estaba usando Sphinx para buscar, pero ahora estoy pensando en usar 'all.paginate' según tu recomendación. – Victor

+0

Desea limitar sus resultados para 1) Experiencia del usuario 2) Rendimiento. –

+0

En este caso, solo se devuelven 50 comentarios. Por lo tanto, el rendimiento no será tan crítico – fl00r

Cuestiones relacionadas