Rails宝石搜索

时间:2016-10-28 13:48:46

标签: mysql ruby-on-rails ruby ruby-on-rails-3

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

(进入网页上的搜索框)

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

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

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

  1. 这是一篇SQL注入
  2. 如果用户的输入无效,则SQL会抛出一个不太漂亮的错误......在处理这些异常时遇到一些问题(虽然这部分是可行的)。
  3. 代码看起来真的很酷,我想知道是否有更好的方法。
  4. 嗯,通过使用搜索宝石,我听说有更好的方法。

    但是,我一直无法找到符合我需求的宝石。许多宝石似乎too complex用于我需要的东西,而我发现的任何内容都没有明确说明你如何能够专门实现我正在寻找的东西 - 用户输入的动态AND / OR语句加入的查询数。

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

2 个答案:

答案 0 :(得分:0)

有一个名为Ransack的搜索宝石

允许您以非常简单的方式搜索模型:

<%= f.search_field :name_or_description_or_email_or_articles_title_cont %>

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

下面是引擎盖下的搜身案例

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

使用简单,可根据需要用于高级搜索

答案 1 :(得分:0)

首先,从不将用户输入直接放入SQL查询中。 (希望你不要或使用sanitize

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

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

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

如果它过于复杂......那么,Ransack就是你需要的那个。

P.S。 如果我搞砸了,请随意纠正我。