活动记录中的多个相似条件

时间:2013-04-22 12:28:53

标签: ruby-on-rails activerecord

我需要针对多个类似的陈述检查我的记录,这样做的最佳方法是什么?即

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

我有桌子可以说我的数据库中的人或(人民)所以我想选择所有姓名如上面3的人。

找到了这个答案:

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

使用like但我无法弄清楚如何传递值数组而不是单个值。任何想法?

更新:

我需要因为人们有两个名字

3 个答案:

答案 0 :(得分:4)

有许多插件可以提供此类查询,但您真正需要的只是Arel

您需要使用类似

之类的内容为LIKE准备查询参数
wildcard_names = names.collect { |name| "%#{name}%" } # => ["%alice%","%bob%","%mark%"]

然后你使用了Arel的#matches_any方法。

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

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

答案 1 :(得分:3)

试试这个

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

在匹配单个列上的多个值时,您可以使用REGEXP代替LIKE   这将使用in子句

生成一个sql语句

检查生成的sql只添加.to_sql

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

答案 2 :(得分:-1)

这样可行 Person.where('name SIMILAR TO ?',"(alice|bob|mark)")

也可以进行高级匹配 Person.where('name SIMILAR TO ?',"%(alice|bob|mark)%")
如果名字是" jon alice"即正则表达式匹配。

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