私の 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 項目だけにリモート検索機能を追加するのは少しばかげているように思えるので、このようにローカル データを使用すると、オートコンプリート機能がより速く感じられると思います。
これを行うより良い方法はありますか?それとも、リモート データ アプローチを使用する必要がありますか?