2012-07-22 7 views
15

Estoy tratando de encontrar registros donde una propiedad especificada no está vacía o en blanco. Como es una cadena, no es nula en la base de datos.Ruby on Rails ActiveRecord donde la propiedad no está en blanco

Post.where(:sourceurl != '') 

Parece que debería funcionar pero sigo obteniendo registros donde la propiedad source_url está vacía. ¿Cuál es la forma apropiada de hacer esto?

Respuesta

22

probar esto

Post.where("sourceurl <> ''") 
+1

@steel por favor lea la pregunta ... la pregunta es para la cadena ... para el número entero puede usar 'Post.where (" sourceurl no es nulo ")' – abhas

+0

Parece que no funciona postgres ..i publicado lo que funcionó para mí ¡de todas formas! – Abs

3

Si ese campo es nulo por defecto en su base de datos, creo que la mejor manera de resolverla a utilizar SQL claro:

Post.where("sourceurl is not null") 
+0

esto incluiría espacios en blanco. – Anna

4

La razón su código doesn' t trabajo es que el parámetro a #where es

:sourceurl != '' 

que evalúa a true, como :sourceurl (el símbolo) no es igual a '' (una cadena vacía). De esta manera el código es el mismo que

Post.where(true) 

Para más detalles sobre la respuesta de Abhas, tanto MySQL y PostgreSQL aceptarán != y <> como equivalentes.

13

Carriles 4

activo condición de registro:

where.not(value: '') 

Alcance:

scope :myscope, -> { where.not(value: '') } 
+0

No usar. En Rails 4 esto producirá 'value! = NULL' – yivo

3

en PostgreSQL para atrapar tanto cadena vacía y nula que puede hacer:

where("coalesce(sourceurl, '') != ''") 
+0

Detallado aquí: http://www.postgresql.org/docs/8.1/static/functions-conditional.html Sección 9.13.2 – user566245

20

ActiveRecord (en los raíles 3 y 4, creo) permite verificar múltiples condiciones al pasar una matriz como argumento. Así que si quería comprobar por tanto nula y '', puede utilizar:

where(sourceurl: [nil, '']) 

En los carriles 4, puede comprobar la condición negativa con .no, por lo que para la pregunta original, que podría hacer:

Post.where.not(sourceurl: [nil, '']) 

.no tiene un poco de magia que hace que sea ventajoso para una consulta SQL puro, ya que funciona a través de bases de datos, hace consultas NOT NULL automáticamente, y un par de cosas más, como se explica aquí: where.not explained

+1

¿Le importaría explicar un poco qué es? ¿hace? Solo poner un código en una respuesta no es tan útil. – wmk

+0

Gracias por arreglar el formato de mi código; Ha pasado un tiempo desde que respondí una pregunta. Déjame editar la respuesta. – kindofgreat