Rails 3跨多个模型自动完成

时间:2011-03-05 21:39:37

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

所以我在Rails 3的Autocomplete上找到了一些很棒的信息,看起来很容易使用。但我有一个不合适的用例,我需要一些建议。

我想让用户能够通过简单的表单将产品和服务添加到发票中。我希望他们能够输入Item字段,并将其从Product.name和Service.name自动完成为单个集合。

我正在考虑尝试编写一个覆盖所有三个的父模型,但我仍然认为这不能解决我的问题,因为我无法根据我的理解在自动完成定义中使用函数。

关于我如何尝试完成此任务的任何建议?即使有简单的搜索示例,它们似乎仅限于单个模型。

2 个答案:

答案 0 :(得分:4)

如果您不反对将Redis引入混音中,请查看https://github.com/seatgeek/soulmate - 来自自述文件:

Soulmate是一个帮助解决开发快速自动完成功能的常见问题的工具。它使用Redis的有序集来构建部分完成的单词的索引和相应的顶部匹配项,并提供一个简单的sinatra应用程序来查询它们。 Soulmate完成你的句子。

Soulmate的设计简单快捷,并提供以下内容:

  • 在单个查询中提供多种类型项目的建议(在SeatGeek,我们为表演者,活动和场地自动填充)
  • 结果按用户指定的分数排序
  • 每个项目的任意元数据(在SeatGeek,我们存储了网址和副标题)

项是一个简单的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" />