rescue true

25 agosto, 2010

Mejorando el rendimiento: find_in_batches y find_each

Archivado en: Ruby on Rails,Tips&Tricks — xurdekio @ 8:09 am
Tags: , ,

Ruby on Rails no deja de sorprenderme con la cantidad de métodos útiles que te puedes encontrar por su API un día aburrido. En esta ocasión os traigo dos métodos para tratar grandes cantidades de registros sin saturar la memoria del servidor.

El primero es find_in_batches, que nos permite traer los registros de la base de datos en lotes, pudiendo pasarle condiciones de búsqueda, tamaño de los lotes, offset…

El segundo es find_each, que es un iterador aprovechando el método anterior.

Estos dos métodos nos permiten procesar simulatenamente en dos (o más) hilos todos los registros de la base de datos, pudiendo estar un worker con los registros del 0 al 10000, otro del 10000 al 20000… etc.

No hay que olvidarse de la nota al pie en la API, estos métodos estan orientados a grandes cantidades de datos, si sólo vas a tratar unos pocos usar el find normal!

6 mayo, 2010

Buscador RESTful en Rails

Archivado en: REST,Ruby on Rails — xurdekio @ 11:20 am
Tags: , , , , , ,

En este post trataré de explicar la forma mas limpia y rápida de construir un buscador RESTful en nuestra aplicación Rails.
El action encargado de devolver los resultados del buscador será el index y el verbo será GET puesto que es la convención para devolver información de listas de objetos. En nuestro ejemplo vamos a trabajar sobre un buscador de noticias, que buscará por texto (en los campos titulo, entradilla, y texto) y entre fechas en el campo created_at.
El partial del buscador quedará tal que así

	<%form_tag({:controller => :noticias, :action => :index}, :method => :get) do%>
                <div>
                     <%= label_tag "busqueda_texto", "Texto "%>
                     <%= text_field_tag "busqueda[texto]" %>
                </div>
                <div>
                     <%= label_tag "busqueda_desde", "Fecha desde "%>
                     <%= date_select "busqueda[desde]" %>
                </div>
                <div>
                     <%= label_tag "busqueda_hasta", "Fecha hasta "%>
                     <%= date_select "busqueda[hasta]" %>
                </div>
		<%=submit_tag("Buscar")%>
	<%end%>

Esto nos dejara las opciones de búsqueda en el hash params[:busqueda].
(más…)

4 mayo, 2010

Will Paginate: Ir a la ultima página con elementos (out of bounds?)

En mis últimos proyectos uso el plugin (ahora gema) ‘will paginate‘ para la paginación de listados. Uno de los problemas que nos encontramos es cuando el listado tiene, por ejemplo, 4 paginas y el usuario intenta ir a la página 5. Esto ocurre normalmente cuando se borra el último elemento de una página.

El propio will_paginate nos ofrece una función para este tipo de casos y su aplicación es bastante trivial.

per_page = 10
@noticias = @noticias.paginate :page => params[:page], :per_page => per_page
@noticias = @noticias.paginate :page => @noticias.page_count, :per_page => per_page if @noticias.out_of_bounds? and @noticias.total_entries > 0

La idea es bastante sencilla. Paginamos por primera vez normal, y, en caso de que la página que nos devuelve el paginate este fuera de los limites (out_of_bounds ) y exista algun elemento (total_entries > 0) volvemos a paginar usando como parametro de página la ultima página con entradas (page_count).

Espero que haya quedado claro! Un saludo.

Tema Rubric. Blog de WordPress.com.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.