1

has_and_belongs_to_many Cuisines の Shop モデルがあります。コントローラーのアクションと編集フォームは次のとおりです。

app/controllers/shops_controller.rb

class ShopsController < ApplicationController
  def edit
    @shop = Shop.where(id: params[:id]).first
    @cuisines = Cuisine.asc(:name)
  end
end

app/views/shops/edit.html.haml

= simple_nested_form_for @shop do |f|
  .control-group
    .control-label
      = f.link_to_add 'Cuisine', :cuisines
    .controls
      = f.fields_for :cuisines do |cuisine|
        = cuisine.input :id, label: false, collection: @cuisines
        = link_to t_action(:remove)

問題は、@cuisines がその店の料理の数だけ評価されることです。初めてクエリを実行した後、クエリはキャッシュされません。

クエリを減らすためにさまざまなソリューションを検索して試した後、次のいずれかを使用すると役立つことがわかりました。

@cuisines = Cuisine.asc(:name).to_a

また

@cuisines = Cuisine.asc(:name).entries

また

@cuisines = Cuisine.asc(:name).cache

自動キャッシュなどを行うための他のオプションを提案できますか?

4

1 に答える 1

0

Mongo は、クエリで使用されるドキュメントをキャッシュし、RAM のワーキング セットに保持します。

http://docs.mongodb.org/manual/faq/storage/#what-is-the-working-set

一方、特定のクエリの結果をキャッシュしたい場合は、別のコレクション (お料理_キャッシュなど) を作成して自分で実行し、クエリ結果をそこに保存できます。検索ごとに、まずキャッシュを検索し、そこに見つからない場合は、実際のクエリを実行して、次のアクセスのためにキャッシュに保存します。キャッシュを期限切れにすることもできます。これには TTL を使用できます。

http://docs.mongodb.org/manual/tutorial/expire-data/

TTL を「x」分に設定できます。データが再度アクセスされた場合は、TTL を再度「x」にリセットして、ドキュメントが x 分間アクセスされていない場合にのみ削除されるようにします。または、データが y 分後に大幅に変化する場合は、「y」のハード リミットを設定できます。いくつかのアプローチを共有するだけで、要件に応じて実際の実装をベースにする必要があります。

于 2013-09-11T13:23:30.503 に答える