如何使用户可以搜索导轨模型?

时间:2012-07-23 00:22:58

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

我正在尝试在rails中公开搜索功能。我希望用户能够输入类似name:"john" color:"blue"的字符串,并获取某些模型的ActiveRecord对象列表,这些对象的名称属性包含john,颜色属性包含blue。我也希望他们能够使用andor以及括号,例如name:"john" or color:"blue"(name:"john" color:"blue") or name:"bill"。理想情况下,他们也可以使用age<20之类的东西,其中age是一个数字字段。有没有一个rails插件可以做到这一点。我一直在简短地看看sphinx和ferret两者似乎都为此创建了一个api,但不清楚它们是否提供了基于文本的明确选项,或者我是否需要自己解析搜索字符串。

2 个答案:

答案 0 :(得分:2)

Ernie Ransack 宝石是一个很好的起点。

您必须在提交的表单和Ransack代码之间提供一个中间层(出于安全原因,这绝对是一个好主意)将字符串从您希望的格式转换为Ransack可以理解。

如果你查看了demo page以及gem的文档,你会发现创建你想要的查询非常简单。

观看如何根据您构建的条件生成GET请求,并在应用程序中替换Ernie在演示中使用单个文本字段接受字符串(name:"john" color:"blue") or name:"bill"的构建器。提交此字段时进行一些模式匹配,并构建一个适当的查询字符串以传递给Ransack gem。

修改

对于未来的问题,例如“什么是______的热门宝石?”,请查看The Ruby Toolbox。如果Ransack不适合您的需求,那么Rails Search类别中的宝石可能就是您所需要的。我个人使用Ransack来完全你所描述的内容;为我的应用程序的User模型提供自定义查询界面。

答案 1 :(得分:0)

我建议你做自己的搜索课。我发现,对于我所做的每个应用程序,搜索的需求都发生了很大的变化,并且很容易创建一个搜索应用程序,该应用程序会考虑您在搜索查询中可能需要的所有变量,并针对您要搜索的任意数量的类进行。

在你的Search类中,让它按照你想要的顺序返回一个集合,集合可以由搜索者可能想要的对象实例组成。