ドロップダウンリストの更新に時間がかかるページに問題があります。基本的に、フォーム内の1つのドロップダウン値を変更すると、2番目のドロップダウンの潜在的なオプションが別のリストに変更されます。
どうすればこれをスピードアップできますか?それが助けになるなら、私は他の理由ですでにREDISを使用しています。
ありがとう!
ドロップダウンリストの更新に時間がかかるページに問題があります。基本的に、フォーム内の1つのドロップダウン値を変更すると、2番目のドロップダウンの潜在的なオプションが別のリストに変更されます。
どうすればこれをスピードアップできますか?それが助けになるなら、私は他の理由ですでにREDISを使用しています。
ありがとう!
プライマリ選択にオプションがほとんどない場合は、最初にページをレンダリングするときに配列のjsハッシュにすべての可能なセカンダリオプションを設定し、プライマリを変更すると、このクライアント側のjs配列からルックアップできます-これは明らかに高速ですが、オプションが多すぎると、最初のページの読み込みが遅くなったり、ページサイズが大きくなったりする可能性があります。
別の方法は、プライマリ選択が変更されたときにajax呼び出しを行うことですが、セカンダリオプションを返すアクションをキャッシュします。これにより、リクエストからのパラメータに基づいてキャッシュし、可能な場合はレンダリングされた結果をRailsキャッシュで使用できるようになります(常にredisまたはdbを押す代わりに)。
AndrewKuklewiczからの素晴らしい答え。それに追加するには...
Railsの「フラグメントキャッシング」を使用します。
ページの読み込み時にクライアントに送信する場合、example.html.erb:
<% cache do %>
<script>
var javascript_hash = {name: '<%=@ruby_val%>'};
</script>
<% end %>
ajaxアクションの出力をキャッシュする必要がある場合は、example.js.erb:
<% cache do %>
alert('hello from javascript');
<% end %>
また、アクション自体で、ActiveRecord :: Relationshipをインスタンス化するだけで、実際にクエリを実行していないことを確認してください。
Company.where({name: 'foo'}) # this
Company.where({name: 'foo'}).all # not this
ローテクなアプローチは、セカンダリドロップダウンのコンテンツを含むクライアントによってキャッシュできる静的なJSONまたはJavaScriptファイルをレンダリングすることかもしれません。
最も単純なバージョンは、たとえば/cache/drop_down.state1.js
、クライアントがオンデマンドでこれらを取得するパスなどに書き込むだけです。Railsページキャッシングシステムを使用して、これらの結果/public
を自動的に保存できるため、後続のリクエストは以前に作成された同じJavaScriptに送信され、データベースへのラウンドトリップは不要になります。必要に応じて期限切れにすることもできます。
これは、ドロップダウンごとに個別に実行できます。または、実用的な場合は、すべてのドロップダウンを一度に実行してから、それを含めて、リストから適切なキーを選択します。
これには、クライアント側のスクリプトを作成して、セカンダリドロップダウンフィールドを動的に作成して入力する必要があります。これには、事前に選択する必要がある場合に適切なエントリを選択することも含まれます。ただし、jQueryのようなヘルパーライブラリではそれほど難しくありません。