2010-11-15 5 views
9

In SQL sollte es so aussehen:Wie schreibe ich das besser? Ruby-Sequel Verkettungs OR

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

My (hässlich) Lösung:

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 

Gibt es eine bessere Lösung zu Kette der oder Bedingungen?

Antwort

3

Sie können wie etwas tun:

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

Aber in Fällen wie diesem, wenn Sie bereits SQL-Abfrage durchdacht haben, finde ich es einfacher, nur ganz eintippen WHERE-Bedingung und verwenden Sequel nur meine Abfrageparameter zu sanieren .

+0

danke funktioniert super. – ipsum

+0

sollte stattdessen 'filter (false)' 'sein, sonst werden die Bedingungen nicht überprüft – brauliobo

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

So elegant Jeremy. –