我需要针对多个类似的陈述检查我的记录,这样做的最佳方法是什么?即
names = ['alice', 'bob', 'mark']
我有桌子可以说我的数据库中的人或(人民)所以我想选择所有姓名如上面3的人。
找到了这个答案:
https://stackoverflow.com/a/5333281/169277
使用like但我无法弄清楚如何传递值数组而不是单个值。任何想法?
更新:
我需要因为人们有两个名字
答案 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只添加.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