Rails:必须匹配所有术语的查询

时间:2015-03-12 17:32:23

标签: postgresql ruby-on-rails-4 activerecord

我有以下型号

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

1 个答案:

答案 0 :(得分:0)

Squeel supports &'和'运营商以及|'或'。

User.where{ (name.like_any(terms)) & (email.like_any(terms)) }