My 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个项目添加远程搜索功能似乎有点傻,所以我假设使用这样的本地数据会使自动完成功能感觉更快。
有更好的方法吗?或者我应该采用远程数据方法吗?
答案 0 :(得分:0)
似乎值得我选择远程选项。您总是可以计算开销。
[KB 200+类别的数据大小] * [每日平均页面请求数]
vs
[数据大小以KB为单位的200多个类别] * [每日平均搜索次数]
除此之外,您还可以按照自己喜欢的方式设计远程搜索。例如,如果在第一次搜索时加载所有选项并随后在客户端上过滤原始列表似乎更快,那么将其构建到源回调中:
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`
}