find_each: accediendo a los datos por lotes

Find_each es el método que permitirá las consultas en lote para base de datos desde Ruby on Rails. Seguro que como cualquier mortal (desarrollador de RoR, of course) en alguna ocasión has planteado la consulta:

> MiModelo.all.each do |instancia| …

Es una mala práctica pero es una solución que a todo hijo de artesano se nos ha ocurrido en algún momento. Siempre es recomendable limitar la petición de datos de una tabla, sobre todo cuando esta sobrepasa con creces los registros de una tabla digamos que “normalita” ( < 10.000 registros). Empezamos a acusar un rendimiento bajo para accesos a la base de datos. Find_each es tu solución. Este operador de loop permite acceder a la base de datos por lotes. Veamos su uso en un ejemplo:

Suponemos que el modelo MyUsers es de 1 millón de registros (si somos la leche)

> MyUsers.all.each do |u| p u.name end #Mostramos el nombre de nuestros usuarios

Ineficiente como ella sola (trabajamos con un array en memoria de 1M de elementos). Veamos una solución con find_each:

> MyUsers.find_each(bacht_size: 1500) do |u| p u.name end

find_each va a acceder a la base de datos 1M/1.5K veces solicitando 1.5k de registros, ahora trabajamos con arrays de 1.5K elementos. Es decir, find_each es una combinación del uso de limit en nuestra consulta y un paginador. TACHAAN!!

Aquí os dejo la documentación sobre find_each en Apidock