2

私は現在次のようなコントローラーメソッドを持っています:

@people = Person.where(conditions).includes(eager_fetch).all

私は今、コントローラーをキャッシュ対応にしようとしています。熱心なフェッチはかなり高価なので、できるだけ多くのデータをロードしないようにしたいと思います。関連する場合、出力はRPCスタイルのエンドポイントからのXMLです。私はに到着しました:

@people = Person.where(conditions).all
@fragments = {}
@people.dup.each do |person|
  cache_key = "fragment-for-#{person.id}-#{person.updated_at.to_i}"
  fragment = Rails.cache.fetch(cache_key)
  unless fragment.nil?
    @fragments[person.id] = fragment
    @people.delete person
  end
end
@people = Person.where(:id => @people.collect(&:id)).includes(eager_fetch).all

最後の行で再クエリを実行する代わりに、ほとんど同じである別の可能性があります。

Person.send :preload_associations, @people, eager_fetch

これを正しく処理するための重要なAPIが不足していますか?現在Rails3.0.12を使用していますが、3.2.xにアップグレードする予定なので、3.2.xでのみ機能するソリューションで十分です。私の解決策はどちらも私にはエレガントに見えません。

(私はこのコードを匿名化して簡略化しました。重要なものを省略した場合はお詫びします)

4

1 に答える 1

0

ActiveRecord の熱心な読み込みに依存しないでください。ActiveRecord のリクエストごとのクエリ キャッシュにないものはすべてロードされます。

代わりに、プライマリ オブジェクトをクエリしてから、独自の巧妙な方法を使用してキャッシュされたものをフェッチし、見逃した ID について低速のデータストアにクエリを実行します。

于 2012-09-27T05:35:47.413 に答える