我有以下型号
class User
# email String
# name String
end
我希望能够执行一个接收搜索字符串的查询,并为符合所有条款的用户提供帮助。例如,我们说我有以下用户:
{ id: 1, name: 'John', email: 'john@email.com' }
如果有人使用'Jo john@em'
进行搜索,则会转换为两个字词('Jo'
和'john@em'
)。在这种情况下,我希望返回ID为1
的用户。但是,如果有人提交了'Joh mark@email.com'
,我就不希望John被退回,因为其中一个条款(mark@email.com
)与姓名或电子邮件不匹配。
我最接近解决此问题的方法是使用此代码(使用squeel
宝石)
terms = term.strip.split(' ').map { |term| "%#{term}%" }
User.where{ (name.like_any(terms)) | (email.like_any(terms)) }
其中terms
是用户搜索的内容。但是,这仅为用户提供至少一个术语,而不是所有术语。
当然,我可以使用多个查询获得我想要的结果并使用Ruby,但我只想在一个查询中执行此操作。
以防万一,我使用PostgreSQL作为我的RDBMS
答案 0 :(得分:0)
Squeel supports &
'和'运营商以及|
'或'。
User.where{ (name.like_any(terms)) & (email.like_any(terms)) }