【问题标题】:How can I make a rails model searchable by the user?如何使用户可以搜索 Rails 模型?
【发布时间】:2012-07-21 06:01:09
【问题描述】:
我正在尝试在 Rails 中公开搜索功能。我希望用户能够输入像name:"john" color:"blue" 这样的字符串,并为某些模型获取ActiveRecord 对象的列表,这些模型的名称属性包含john,颜色属性包含blue。我还希望他们能够使用 and 和 or 以及括号,例如name:"john" or color:"blue" 或 (name:"john" color:"blue") or name:"bill"。理想情况下,他们还可以使用 age<20 之类的东西,其中年龄是一个数字字段。有没有一个rails插件可以做到这一点。我已经简要地查看了 sphinx 和 ferret 两者似乎都为此创建了一个 api,但尚不清楚它们是否提供了基于明文的选项,或者我是否需要自己解析搜索字符串。
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
search
【解决方案1】:
Ernie 的 Ransack gem 是一个很好的起点。
您必须在提交的表单和 Ransack 代码之间提供一个中间层(出于安全原因,无论如何这都是个好主意),以便将字符串从您想要的格式转换为 Ransack 可以使用的格式明白。
如果您查看 demo page 和 gem 的文档,您会发现创建所需的查询类型非常简单。
观察GET 请求是如何从您构建的条件生成的,并在您的应用程序中将演示中的构建器替换为一个接受(name:"john" color:"blue") or name:"bill" 等字符串的文本字段。提交此字段时进行一些模式匹配,并构建适当的查询字符串以传递给 Ransack gem。
编辑
对于未来的问题,例如“______ 的热门宝石是什么?”,请查看The Ruby Toolbox。如果 Ransack 不能满足您的需求,那么 Rails Search 类别中的宝石可能有您正在寻找的东西。我个人将 Ransack 用于正是您所描述的;为我的应用程序的User 模型提供自定义查询接口。
【解决方案2】:
我建议做你自己的搜索类。我发现对于我所做的每个应用程序,搜索需求都发生了很大变化,创建一个搜索应用程序非常简单,它考虑了搜索查询中可能需要的所有变量,并针对你想要搜索的任意数量的类构成。
在您的 Search 类中,让它按照您想要的顺序返回一个集合,并且该集合可以由搜索者可能想要的对象实例组成。