2010-11-15 67 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