2009-06-10 3 views
1

Étant donné une méthode ActiveRecord ou une chaîne named_scope, existe-t-il un moyen de retourner le SQL qui sera exécuté, sans l'exécuter réellement?Obtenir le SQL qui serait exécuté à partir d'une certaine méthode ou named_scope

par exemple.

Vote.positive.count.sql #=> "SELECT COUNT(*) FROM votes WHERE value > 0" 

Existe-t-il un moyen intégré de faire cela ou un plug-in qui offre cette fonctionnalité? Sinon, des indices sur l'endroit où je peux commencer à construire mon propre plug-in ou au moins une solution pour ce projet en cours.

Vive

Répondre

1

Cela fait si longtemps, mais j'ai pensé qu'il serait utile de souligner que Rails3 aura un support pour cela sur n'importe quelle méthode scope/finder/model qui finirait par atteindre la DB.

4

Vous pouvez obtenir des informations sur un champ nommé comme ceci:

Vote.positive.proxy_options 

Comme pour obtenir l'instruction SQL complète, ActiveRecord met cela ensemble en utilisant une méthode protégée appelée construct_finder_sql.

Vous pouvez essayer ceci:

Vote.positive.send(:construct_finder_sql, {}) 

La méthode utilisée est différente pour les requêtes de calcul:

Vote.positive.send(:construct_calculation_sql, :count, :id, {}) 

dans les deux cas l'argument de hachage vide peut avoir des clés comme :conditions, :order, :limit ou quelques options supplémentaires que vous pouvez découvrir en inspectant les corps de ces méthodes.

Questions connexes