用于搜索的Rails Gem

我有一个webapp,我想提供一个高级搜索,用户输入由AND和/或OR连接的任意数量的查询,如下所示:

(进入网页上的搜索框)

name = "john" OR (occupation = "gardener" AND hobby.main = "reading") 

在之前的文章中 ,我成功地实现了一个系统,在该系统中,我将如上格式化的查询直接转换为有效的SQL语句,并将它们直接输入SQL以查询数据库。

这有效,但现在我担心三件事:

  1. 这是一个SQL注入的怪话
  2. 如果用户的输入无效,则SQL会抛出一个不太漂亮的错误……在处理这些exception时遇到一些麻烦(尽管这部分是可行的)。
  3. 代码看起来真的很hacky,我想知道是否有更好的方法。

好吧,通过使用搜索gem,我听说有更好的方法。

但是,我一直无法找到符合我需求的gem。 许多gem看起来太 复杂了我所需要的东西,我发现的任何内容都没有明确说明你如何能够专门实现我正在寻找的东西 – 用户输入由AND / OR连接的动态数量的查询声明。

将语句直接转换为SQL语法并将其正确注入,就像我现在正在做的那样,究竟有多昂贵? 将这些gem中的一种纳入我想要的东西是多么容易? “有经验的”Rails开发人员会做什么? 我是Rails的完全noobie,所以我没有任何经验。

有一个名为Ransack的搜索gem

这使您可以以一种非常简单的方式搜索模型:

 <%= f.search_field :name_or_description_or_email_or_articles_title_cont %> 

上面的例子是一个标签,点击时会搜索名称或说明或电子邮件或article_title列,其中包含搜索文本字段中提供的内容

下面是引擎盖下的一个hansack的例子

 >> User.ransack(first_name_cont: 'Rya').result.to_sql => SELECT "users".* FROM "users" WHERE ("users"."first_name" LIKE '%Rya%') 

它易于使用,如果需要可用于高级搜索

首先, 永远不要将用户输入直接放入SQL查询中。 (希望你不要或使用消毒 )

其次,我不确定,但也许你真的不需要高级搜索,而是高级filter 。 强制用户编写复杂查询不是一个好主意。 在这种情况下,您可能希望为每个语句添加单独的输入。 也许它不符合你的要求,但是……只是想一想。

第三,如果您需要真正的高级搜索,我建议您不要将此任务放在您的数据库上。 即使您有正确的索引,对大(例如10 000行)表的复杂查询也会非常缓慢 。 它不仅会使您的应用程序用户不友好,而且还容易受到廉价(甚至免费)DDoS攻击。

为此,您应该使用为其构建的工具。 Elasticserach是我喜欢的。 它有很棒的gem( Base , Rails integraion ),可以带来很多肮脏的工作。 仍然不是那么容易(特别是第一次)让它在工作中,但你得到的好处是值得的。

如果它太复杂了……那么,Ransack就是你需要的那个。

PS如果我搞砸了,请随意纠正我。