我的 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 个项目的远程搜索功能似乎有点傻,所以我认为使用这样的本地数据会使自动完成功能感觉更快。
有一个更好的方法吗?还是我应该使用远程数据方法?