2010-10-13 3 views
6

Dans une partie de statistiques d'une application Rails, j'ai des appels SQL personnalisés qui sont appelés avec ActiveRecord :: Base.execute() à partir du code du modèle. Ils renvoient divers agrégats.Comment utiliser ActiveRecord Query Cache avec SQL personnalisé

Certaines de ces requêtes (identiques) sont exécutées dans une boucle du contrôleur et il semble qu'elles ne soient pas mises en cache par le cache de requêtes ActiveRecord.

Est-il possible de mettre en cache des requêtes SQL personnalisées dans une même requête?

Répondre

5

Vous ne savez pas si AR prend en charge la mise en cache des requêtes pour #exécute, vous pourriez vouloir explorer la documentation. De toute façon, ce que vous pouvez faire, c'est d'utiliser la mémorisation, ce qui signifie que vous garderez les résultats manuellement jusqu'à ce que la demande en cours soit terminée.

faire quelque chose comme ceci dans votre modèle:

def repeating_method_with_execute 
    @rs ||= ActiveRecord::Base.execute(...) 
end 

ce sera essentiellement exécuter la requête uniquement sur la première fois et puis enregistrez la réponse à @rs tant que la demande est entièrement terminée.

si je ne me trompe pas, Rails 2.x a déjà une macro appelée memoization sur ActiveRecord qui fait tout cela automatiquement

espère que cela aide

+0

je avais besoin @@ class_variables, mais, à part ça, exactement ce que je cherchais. Merci. –