私は現在次のようなコントローラーメソッドを持っています:
@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でのみ機能するソリューションで十分です。私の解決策はどちらも私にはエレガントに見えません。
(私はこのコードを匿名化して簡略化しました。重要なものを省略した場合はお詫びします)