#15 Fun with Find Conditions
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.