我正在尝试在网站中创建搜索功能,并且希望用户能够搜索多个单词,根据各种模型中存在的条件执行子字符串匹配。
为了这个例子,假设我有以下模型:
- Employee
- Company
- 市政府
- County
一个县有多个市,其中有多家公司,有多名员工。
我希望搜索能够搜索 Employee.firstname、Employee.lastname、Company.name、Municipality.name 和 County.name 的组合,并且我希望最终结果是 Employee 实例。
例如,搜索字符串“joe tulsa”应返回所有员工,其中这两个单词都可以在我在上一句中命名的属性中的某处找到。我会得到一些误报,但至少我应该让塔尔萨县的每个员工都命名为“Joe”。
我尝试了几种方法,但我不确定我是否走在正确的道路上。我正在寻找一种很好的 RoR 式的方法来做到这一点,并且我希望具有更多 RoR 智慧的人可以帮助概述一个正确的解决方案。
我尝试过的:
我对这种搜索不太有经验,但在 RoR 之外,我会手动创建一个 SQL 语句将所有表连接在一起,为每个单独的搜索词创建 where 子句,覆盖不同的表。也许使用构建器。然后只需执行查询并循环结果,手动实例化 Employee 对象并将它们添加到数组中。
为了在 RoR 中解决这个问题,我:
1)在我的项目中涉足与 Employee 模型相对应的命名范围,但是当我需要加入两个或更多“步骤”之外的表(市和县)时,我陷入了困境。
2)创建一个视图(称为“search_view”),将所有表连接在一起,以简化查询。然后我想我会在这个表上使用 Employee.find_by_sql() ,这会产生这些漂亮的 Employee 对象。我想我应该使用构建器来创建 SQL,而且似乎可以使用 Arel,所以我尝试执行以下操作:
view = Arel::Table.new(:search_view)
但生成的 Ariel::Table 不包含任何列,因此它无法用于构建我的查询。此时我有点卡住了,因为我不知道如何获得一个可用的查询生成器。
我强烈建议您使用合适的搜索引擎来进行此类操作,它会让您的生活变得更加轻松。我遇到了类似的问题,我想“天哪,我打赌设置像 Sphinx 这样的东西意味着我必须先阅读数千本手册和教程”。嗯,事实并非如此。
思考狮身人面像是我推荐的 Rails gem,它使得集成 Sphinx 变得非常容易。您根本不需要有太多经验就可以开始:
http://freelancing-god.github.com/ts/en/
我没有尝试过其他搜索引擎,但我对Sphinx非常满意。我在不到一天的时间里成功地建立了一个相对复杂的实时搜索。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)