homeASCIIcasts

15: Condiciones del método Find 

(view original Railscast)

Other translations: En It Fr

Other formats:

Written by Aldo Escudero (aldoescudero.com.ar)

En este episodio veremos las condiciones del método Find. Debajo hay algunas líneas de script/console, mostradas con el código SQL que generan.

Task.find(:all, :conditions => ["completed = ? AND priority = ?", false, 2])
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority = 2)  

Buscando todas las tareas incompletas con una prioridad de 2.

El ejemplo de arriba funciona, pero y si estamos buscando las tareas que tienen una prioridad que es nil?

Task.find(:all, :conditions => ["completed = ? AND priority = ?", false, nil])
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority = NULL)   

La búsqueda de valores nulos genera código SQL incorrecto.

El código SQL generado arriba es incorrecto. Para buscar valores nulos la sintaxis correcta sería priority IS NULL, en vez de, priority = NULL. De igual manera, si deseamos buscar más de un valor de prioridad utilizando un arreglo o rango, tendríamos que cambiar la cadena del find para utilizar IN en lugar de =, y agregar paréntesis alrededor del segundo símbolo de interrogación. Así lograremos asegurarnos que el código SQL generado tiene la sintaxis correcta.

Task.find(:all, :conditions => ["completed = ? AND priority IN (?)", false, [1,3]])
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority IN (1,3)  

Desde Rails 1.2 tenemos una mejor forma de pasar condiciones: a través de un hash. El uso de un hash de condiciones asegura que Rails utiliza las condiciones correctas al realizar queries (consultas) a la base de datos.

Task.find(:all, :conditions => { :completed => false, priority => [1,3] }
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority IN (1,3)  

El uso de un hash de condiciones con un arreglo de parámetros.

Task.find(:all, :conditions => {:completed => false, :priority => 2..4})
SELECT * FROM "tasks" WHERE ("tasks"."priority" BETWEEN 2 AND 4 AND "tasks"."completed" = 'f')   

Paso de un rango y BETWEEN.

Uso con finds dinámicos.

Cuando vimos el episodio 2, utilizamos métodos find_by dinámicos. Estos también pueden tomar argumentos nil, arreglos o rangos.

Task.find_by_priority(1..5)
SELECT * FROM "tasks" WHERE ("tasks"."priority" BETWEEN 1 AND 5) LIMIT 1  

Al utilizar un hash de condiciones, nos aseguramos que Rails genere código SQL correcto al pasarle cualquier tipo de parámetros.