2009-05-19 6 views
5

Je sais que dans les rails 2.3.2 requêtes ActiveRecord sont mises en cache, à savoir que vous pouvez voir quelque chose dans le journal de développement/production:Modèles ActiveRecord mis en cache dans des tâches rake?

CACHE (0.0ms) SELECT * FROM `users` WHERE `users`.`id` = 1 

Je me demandais si les mêmes principes pour ratisser les tâches.

J'ai une tâche rake qui va interroger beaucoup de modèles différents, et je veux savoir si je devrais implémenter ma propre mise en cache, ou si ce comportement est inclus par défaut.

De même, existe-t-il un moyen de voir les requêtes sql qui sont effectuées au cours de la tâche rake? Semblable à celle du journal de développement/production

Répondre

1

Une tâche rake s'exécutera dans l'environnement que vous spécifiez, auquel cas elle adoptera les règles de cet environnement.

Vous pouvez définir les rails env de la ligne de commande:

RAILS_ENV=test 

Logging peut être réglée dans le cadre du râteau et vous devriez voir ceci dans vos rails normaux connecter.

2

Vous parlez d'ActiveRecord Query Caching. Cela devrait également fonctionner dans Rake-Tasks, à condition que vous les exécutiez dans un environnement avec la mise en cache activée, par ex. production. Voir Rails Guide on Caching pour des exemples.

Il peut ou peut ne pas être le bon type de mise en cache pour votre cas:

u1=User.find 1 # loads user1 first time from DB 
u2=User.find 2 # loads user2 first time from DB 
u1again = User.find 1 # loads user1 from cache 
all = User.all # loads user1 and user2 from DB again 
+0

Je pense que cela pourrait être vrai dans les contrôleurs. Il y a du texte ici: "il est important de noter que les caches de requêtes sont créés au début d'une action et détruits à la fin de cette action et ne persistent donc que pendant la durée de l'action." Vous devriez regarder votre journal d'environnement (c'est-à-dire log/test.log, si vous prenez la réponse ci-dessus) et vous verrez les requêtes SQL répétées. – chug2k

1

Le cache SQL n'est pas activé par défaut pour les tâches de râteau. Vous pouvez envelopper votre code dans un bloc de cache, comme ceci:

task :foobar => :environment do 
    ActiveRecord::Base.connection.cache do 
    User.find 1 # Will hit the db 
    User.find 1 # Will hit the cache 
    end 
end 

C'est essentiellement ce que Rails fait pour les actions du contrôleur. Notez que le cache utilise de la mémoire et que les tâches de rake ont tendance à fonctionner avec de gros ensembles de données, ce qui peut vous poser des problèmes. Vous pouvez sélectivement désactiver la mise en cache pour certaines parties de votre code, en utilisant uncached

Questions connexes