0

我的 Rails 3.2 应用程序在其导航菜单中(即在每个页面上)都有一个搜索栏,可以让用户搜索产品类别。目前有约 20 个类别,但预计将增长到约 200 个类别。当前类别列表每天最多可以更改一次或两次。

我正在使用 JQuery UI Autocomplete 来提供匹配产品类别名称作为用户类型的建议。

自动完成有两个选项来提供它建议的术语:本地或远程。您可以为它提供一个字符串数组,它会在客户端进行搜索,或者您可以为它提供一个 URL,它会根据用户实时输入的内容返回 JSON 和建议的术语(即搜索是在服务器上)。

目前,我正在使用本地数据方法,但我正在动态生成此本地数据。在 category.js.coffee 中:

$('#search').autocomplete
    source: $('#search').data('autocomplete-source')

我使用辅助方法生成潜在结果数组,并使用 HTML5 数据元素将数组存储在搜索文本字段中:

<%= text_field_tag :search, params[:search], :data => { :autocomplete_source => category_array.to_json } %>

辅助方法只是从数据库中收集所有类别名称,并将它们放入一个数组中:

def category_array
  Category.pluck(:name)
end

我的问题是:这是一种合理的方法吗?

我担心的是,由于导航栏出现在每个页面上,我正在访问数据库以收集每个页面请求上的所有类别名称。我对此太陌生,不知道 Rails/Postgres 缓存是否解决了这种性能问题。但是,仅添加 200 个项目的远程搜索功能似乎有点傻,所以我认为使用这样的本地数据会使自动完成功能感觉更快。

有一个更好的方法吗?还是我应该使用远程数据方法?

4

1 回答 1

0

对我来说似乎值得远程选择。您始终可以计算开销。

[KB 200+ 类别的数据大小] * [每天平均页面请求数]

对比

[超过 200 个类别的 KB 数据大小] * [每天的平均搜索次数]

除此之外,您还可以按照自己喜欢的方式设计远程搜索。例如,如果在第一次搜索时加载所有选项会更快,然后在客户端过滤原始列表,则将其构建到源回调中:

source: function( request, response ) { 
    // make request for all categories and send back a response
    // set a flag to indicate the data has been loaded
    // for subsequent requests and filter on `request.term`
}
于 2013-02-27T16:30:55.640 回答