0

私の Rails 3.2 アプリケーションには、ナビゲーション メニュー (つまり、すべてのページ) に検索バーがあり、ユーザーは製品カテゴリを検索できます。現在、約 20 のカテゴリがありますが、これは約 200 のカテゴリまで成長すると予想されます。現在のカテゴリのリストは、1 日に 1 回または 2 回変更される可能性があります。

JQuery UI Autocomplete を使用して、ユーザー タイプに一致する製品カテゴリ名を提案しています。

オートコンプリートには、提案する用語を提供するための 2 つのオプションがあります。ローカルまたはリモートです。文字列の配列を指定してクライアント側で検索するか、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+ カテゴリのデータ サイズ] * [1 日あたりの平均ページ リクエスト数]

[200 以上のカテゴリのデータ サイズ (KB)] * [1 日あたりの平均検索数]

さらに、リモート検索を好きなように設計することもできます。たとえば、最初の検索ですべてのオプションをロードし、その後クライアントで元のリストをフィルタリングする方が高速に見える場合は、それをソース コールバックに組み込みます。

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 に答える