2010-11-15 10 views
9

En SQL que debería tener este aspecto:¿Cómo escribir esto mejor? Rubí Sequel encadenamiento O

SELECT * FROM `categories_description_old` WHERE ((`categories_description` = '') OR (`categories_name` = '') OR (`categories_heading_title` = '')) 

Mi solución (feo):

conditions = [:categories_name, :categories_heading_title, :categories_description] 
b = table_categories_description_old.filter(conditions.pop => "") 
conditions.each do |m| 
b = b.or(m => "") 
end 

¿Hay una mejor solución a la cadena o condiciones?

Respuesta

3

Usted puede hacer algo como:

conditions.inject(table_categories_description_old.filter(true)){|acc, cond| 
    acc.or(cond => '') 
} 

Pero en casos como este cuando ya se ha pensado consulta SQL, me resulta más fácil simplemente escribir toda condición WHERE y usar Sequel sólo para desinfectar mis parámetros de consulta .

+0

thanks works great. – ipsum

+0

debería ser 'filter (false)' en su lugar, de lo contrario las condiciones no se verifican – brauliobo

16
DB[:categories_description_old]. 
    filter({:categories_description=>'', 
      :categories_name=>'', 
      :categories_heading_title=>''}.sql_or) 
+2

Tan elegante Jeremy. –

Cuestiones relacionadas