2010-11-15 6 views
9

In SQL dovrebbe apparire come questo: soluzione di (brutto)Come scrivere meglio? Rubino Sequel concatenamento O

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

mio:

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 

C'è una soluzione migliore per la catena o le condizioni?

risposta

3

Si può fare qualcosa di simile:

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

Ma in casi come questo, quando si è già pensati query SQL, trovo più facile da digitare solo tutta la condizione WHERE e utilizzare Sequel solo per disinfettare i miei parametri di query .

+0

grazie funziona alla grande. – ipsum

+0

dovrebbe essere 'filtro (falso)' invece, altrimenti le condizioni non sono controllate – brauliobo

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

Jeremy così elegante. –