我正在尝试在网站中创建搜索功能,我希望用户能够搜索多个单词,对各种模型中存在的条件执行子字符串匹配。
为了这个例子,假设我有以下模型:
一个县有多个城市,有多个公司,有多名员工。
我希望搜索能够搜索Employee.firstname,Employee.lastname,Company.name,Municipality.name和County.name的组合,并且我希望最终结果是Employee实例。
例如,搜索字符串“joe tulsa”应返回所有Employees,其中两个单词都可以在我在上一句中命名的属性中找到。我会得到一些误报,但至少我应该让每个名叫“乔”的员工都在塔尔萨县。
我尝试过几种方法,但我不确定自己是否会走正轨。我正在寻找一种很好的RoR-ish方法,我希望有更多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不包含任何列,因此它不能用于构建我的查询。在这一点上,我有点卡住,因为我不知道如何获得一个有效的查询构建器。
答案 0 :(得分:3)
我强烈建议您使用适当的搜索引擎,这样可以让您的生活更轻松。我有一个类似的问题,我想“男孩,我打赌设置像Sphinx这样的东西意味着我必须首先阅读成千上万的手册和教程”。嗯,事实并非如此。
思考Sphinx 是我推荐的Rails gem,它可以很容易地集成Sphinx。你根本不需要太多的经验来开始:
http://freelancing-god.github.com/ts/en/
我没有尝试过其他搜索引擎,但我对Sphinx非常满意。我设法在不到一天的时间内建立了一个相对复杂的实时搜索。