【问题标题】:Rails 3 Autocomplete Across Multiple ModelsRails 3 跨多个模型自动完成
【发布时间】:2011-07-09 13:57:43
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    Soulmate 旨在简单快速,并提供以下功能:

    • 在单个查询中为多种类型的项目提供建议(在 SeatGeek,我们会自动完成表演者、活动和场地)
    • 结果按用户指定的分数排序
    • 每个项目的任意元数据(在 SeatGeek,我们同时存储 url 和字幕)

    项目是一个简单的 JSON 对象,如下所示:

    {
      "id": 3,
      "term": "Citi Field",
      "score": 81,
      "data": {
        "url": "/citi-field-tickets/",
        "subtitle": "Flushing, NY"
      }
    }
    

    其中id 是唯一标识符(在特定类型内),term 是您希望为其提供补全的短语,score 是用户指定的排名指标(redis 将按字典顺序对具有相同的分数),data 是您希望在匹配此项目时返回的元数据的可选容器(在 SeatGeek,我们包含该项目的 url 以及当我们在自动完成下拉菜单)。

    SeatGeek 观看灵魂伴侣的行动。

    如果不出意外,也许它会给你一些关于如何以有意义的方式构造数据的想法。

    我没有写或与灵魂伴侣有任何关系。这只是我在尝试解决类似问题时发现的一个库。希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      如果客户端自动完成是一个选项(例如,您的产品和服务很少),您可以使用 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" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2011-01-03
        相关资源
        最近更新 更多