Rails 3多模型自动完成

8

我在Rails 3的自动完成功能上找到了一些很棒的信息,看起来使用起来非常简单。但是我有一个不适用的用例,需要一些建议。

我希望用户通过一个简单的表单添加产品和服务到发票中。我希望他们能够在项目字段中输入内容,并从Product.name和Service.name两个模型中自动完成为一个集合。

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

有关如何实现这一点的任何建议?即使是那些简单的搜索示例,它们似乎也只限于单个模型。

2个回答

4
如果您不介意引入Redis,可以看看https://github.com/seatgeek/soulmate -- 从README中了解到:
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的实际应用。

如果没有其他内容,也许它会给您一些关于如何以合理的方式构建数据的想法。

我没有编写或与soulmate有任何关系。这只是我在尝试解决类似问题时发现的一个库。希望它能有所帮助!


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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接