2013-04-22 90 views
2

我需要检查我的记录与多个类似的语句,最好的方法是什么?即多条活动记录中的条件

names = ['alice', 'bob', 'mark'] 

我有表可以说,在我的数据库或(人民)的人,所以我想选择谁拥有的名称,如高于3所有的人。

找到这个答案:

https://stackoverflow.com/a/5333281/169277

对于使用等,但我无法弄清楚如何通过值,而不是单值的数组。有任何想法吗?

UPDATE:

我需要一个像因为人有两个名字

回答

3

试试这个

names = ['alice', 'bob', 'mark'] 
Person.where('name REGEXP ?',names.join('|')) 

同时匹配像上一列多个值,你可以使用REGEXP代替LIKE 这将生成一个sql语句,并在条款

检查生成的SQL只需添加.to_sql

Person.where('name REGEXP ?',names.join('|')).to_sql 
+0

我需要像,因为有人可以有两个名字和这两个名字一个是不中间名 – 2013-04-22 12:46:19

+0

@GandalfStormCrow okayy,我已经更新了我的答案 – PriteshJ 2013-04-22 19:26:02

4

有一些插件来提供这种类型的查询,但你真正需要的是Arel

你需要使用像这样

wildcard_names = names.collect { |name| "%#{name}%" } # => ["%alice%","%bob%","%mark%"] 

准备查询参数LIKE,那么你会使用阿雷尔的#matches_any方法。

people_table = People.arel_table 
People.where(people_table[:name].matches_any(wildcard_names)) 

如PriteshJ提到的,添加to_sql以确认查询是正确的。

+1

刚一说明:在更大的数据集领先的通配符可能会导致性能问题。 – Magnuss 2013-04-22 13:33:32

-1

这将工作。
Person.where('name SIMILAR TO ?',"(alice|bob|mark)")

先进的匹配也可以做
Person.where('name SIMILAR TO ?',"%(alice|bob|mark)%")
以上生产线也将工作,如果名称为“乔恩爱丽丝”即正则表达式匹配。

参考PostgreSQL文档:http://www.postgresql.org/docs/9.0/static/functions-matching.html