2

我需要根据多个类似的语句检查我的记录,最好的方法是什么?IE

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

我有一个表格,可以说我的数据库中的 People 或(Peoples),所以我想选择所有名字如上述 3 的人。

找到了这个答案:

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

对于使用 like 但我不知道如何传递值数组而不是单个值。有任何想法吗?

更新 :

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

4

3 回答 3

4

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

您需要使用类似这样的方法为 LIKE 准备查询参数

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

然后你使用了#matches_anyArel的方法。

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

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

于 2013-04-22T13:10:32.553 回答
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
于 2013-04-22T12:34:27.527 回答
-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

于 2015-10-01T10:31:43.447 回答