所以我在Rails 3的Autocomplete上找到了一些很棒的信息,看起来很容易使用。但我有一个不合适的用例,我需要一些建议。
我想让用户能够通过简单的表单将产品和服务添加到发票中。我希望他们能够输入Item字段,并将其从Product.name和Service.name自动完成为单个集合。
我正在考虑尝试编写一个覆盖所有三个的父模型,但我仍然认为这不能解决我的问题,因为我无法根据我的理解在自动完成定义中使用函数。
关于我如何尝试完成此任务的任何建议?即使有简单的搜索示例,它们似乎仅限于单个模型。
答案 0 :(得分:4)
如果您不反对将Redis引入混音中,请查看https://github.com/seatgeek/soulmate - 来自自述文件:
Soulmate是一个帮助解决开发快速自动完成功能的常见问题的工具。它使用Redis的有序集来构建部分完成的单词的索引和相应的顶部匹配项,并提供一个简单的sinatra应用程序来查询它们。 Soulmate完成你的句子。
Soulmate的设计简单快捷,并提供以下内容:
项是一个简单的JSON对象,如下所示:
{
"id": 3,
"term": "Citi Field",
"score": 81,
"data": {
"url": "/citi-field-tickets/",
"subtitle": "Flushing, NY"
}
}
id
是唯一标识符(在特定类型中),term
是您希望为其提供完成的短语,score
是用户指定的排名指标(redis将按字典顺序为具有相同分数的项目订购内容),data
是您希望在匹配此项目时返回的元数据的可选容器(在SeatGeek,我们包含该项目的URL以及我们在自动完成下拉列表中显示的副标题。)
见SeatGeek的Soulmate行动。
如果没有别的,也许它会给你一些关于如何以有意义的方式构建数据的想法。
我没有写或与灵魂伴侣有任何关系。它只是我在尝试解决类似问题时发现的库。希望它有所帮助!
答案 1 :(得分:1)
如果客户端自动完成是一个选项(例如,您的产品和服务很少),您可以使用JQuery自动完成功能:
控制器:
@keys = @categories.map { |x| x.name } + @entries.map { |x| x.description }
@autocomplete_categories = @keys.to_json.html_safe
视图:
<script type="text/javascript">
$(document).ready(function() {
var data = <%= @autocomplete_categories %>;
$("#auto").autocomplete( { source: data } );
});
</script>
<input type="text" name="auto" id="auto" />