2011-12-23 5 views

Respuesta

43

Como señala Erwin, una simple comparación text_value <> '' funcionará en este caso.

scope :comments, where("text_value <> ''") 

(Carriles 3 prefiere esta sintaxis de consulta para scope -así como find, all, etc.-en lugar de una opciones por ejemplo de hash :conditions => .... Este último es deprecated in Rails 3.1.)

En los carriles 4, la segundo argumento debe ser un lugar lambda:

scope :comments, ->{ where("text_value <> ''") } 
+1

El 'COALESCE()' es simplemente un error en este caso, porque 'NULL <> ''' produce 'NULL'. Solo las condiciones "VERDADERAS" califican una fila. –

+1

Buena captura, @ErwinBrandstetter. He actualizado mi respuesta. –

+0

¿Qué pasa? - scope: comentarios, donde ("NOT text_value IS NULL") – JoshOiknine

8

Utilice text_value <> '' para cubrir eficazmente casos ambos.

Solo será TRUE para text_value que no es NULL ni empty.

3
scope :comments, where("text_value <> ''") 
+0

'OR' es el operador incorrecto. Esto aceptaría un 'text_value' vacío. –

+0

sí, text_value vacío tampoco es NULL;) - ahora está corregido, gracias – maprihoda

+0

Ahora es correcto. Pero no necesita la prueba adicional 'text_value IS NOT NULL'. Ver mi respuesta y otros comentarios. Los operadores '<>' y '! =' Son idénticos para los tipos de caracteres (y la mayoría de los otros tipos también). –

28

carriles 4

scope :comments, -> { where.not(:text_value => nil) } 
+8

Esto no * funciona como las preguntas originales. – Backo

+0

De acuerdo con @Backo, pero para aclarar, esto no filtra los espacios en blanco, solo nils. – Dty

47

En Rails 4 que puede hacer

where.not(text_value: '') 
+0

La hermosa solución. – Karl

+1

Definitivamente la mejor respuesta para Rails 4 y superiores – Dty

+0

¿Esto no devolverá las filas donde text_value es nulo? – Doug

1

Personalmente estoy haciendo de esta manera:

1) Añadir a la inicializadores

class Arel::Attributes::Attribute 
    # Encode column name like: `posts`.`author_id` 
    def to_sql 
    "`#{relation.table_name}`.`#{name}`" 
    end 

    def is_not_empty 
    "#{to_sql} <> ''" 
    end 
end 

2) Añadir a su modelo

scope :comments, -> { where(arel_table[:text_value].is_not_empty) } 

¡Buena suerte!

+0

Hay una [gema] (https://github.com/yivo/arel-is-blank) para ello. – yivo

Cuestiones relacionadas