我需要根据多个类似的语句检查我的记录,最好的方法是什么?IE
names = ['alice', 'bob', 'mark']
我有一个表格,可以说我的数据库中的 People 或(Peoples),所以我想选择所有名字如上述 3 的人。
找到了这个答案:
https://stackoverflow.com/a/5333281/169277
对于使用 like 但我不知道如何传递值数组而不是单个值。有任何想法吗?
更新 :
我需要喜欢,因为人们有两个名字
我需要根据多个类似的语句检查我的记录,最好的方法是什么?IE
names = ['alice', 'bob', 'mark']
我有一个表格,可以说我的数据库中的 People 或(Peoples),所以我想选择所有名字如上述 3 的人。
找到了这个答案:
https://stackoverflow.com/a/5333281/169277
对于使用 like 但我不知道如何传递值数组而不是单个值。有任何想法吗?
更新 :
我需要喜欢,因为人们有两个名字
有许多插件可以提供这种查询,但您真正需要的只是Arel。
您需要使用类似这样的方法为 LIKE 准备查询参数
wildcard_names = names.collect { |name| "%#{name}%" } # => ["%alice%","%bob%","%mark%"]
然后你使用了#matches_any
Arel的方法。
people_table = People.arel_table
People.where(people_table[:name].matches_any(wildcard_names))
正如 PriteshJ 提到的,添加to_sql
以确认查询是正确的。
尝试这个
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
这将起作用。
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