2010-11-15 45 views
9

在SQL它應該是這樣的:如何寫得更好?紅寶石續集鏈或

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

我(醜)解決方案:

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 

是否有更好的解決方案,以連鎖或條件?

回答

3

你可以這樣做:

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

但是,在這樣的情況下,當你已經想到了SQL查詢,我覺得它更容易只需鍵入整個WHERE條件和使用續集只是爲了清理我的查詢參數。

+0

謝謝偉大的作品。 – ipsum 2010-11-15 16:10:50

+0

它應該是'filter(false)',否則條件不會被檢查 – brauliobo 2016-03-08 12:57:45

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

如此優雅的傑里米。 – 2010-11-15 19:30:57