Comment puis-je obtenir de l'instruction SQL créé par ActiveRecord#trouver sans réellement l'exécuter?
Je suis en utilisant will_paginate
avec certaines requêtes compliquées et il est incapable de calculer correctement le nombre total d'enregistrements (pour afficher le nombre correct de la page des liens) - à savoir, en raison du regroupement de plusieurs colonnes.
Donc, je suis l'intention d'obtenir la requête SELECT qui serait utilisé pour récupérer TOUS les enregistrements, sans réellement l'exécuter, et l'envelopper avec SELECT COUNT(*) FROM ...
manuellement, afin d'obtenir le nombre d'enregistrements.
Toutes les idées comment faire?
Edit: je suis à l'aide de Rails 2.3.x
Vous devez vous connecter pour publier un commentaire.
Pour Rails 3:
Découvrez la ActiveRecord::Relation docs à la Rails 3 docs.
Il semble thatm dans les Rails 2.x, une méthode privée appelée
ActiveRecord::Base#construct_finder_sql
pourrait être utilisé, j'ai besoin de le tester plus et de voir si cela va fonctionner pour moi:Je sais que la question demande "sans l'exécuter", mais le
#explain
méthode est très utile et devrait au moins être mentionné ici. Il est extrêmement utile pour le débogage des requêtes lentes.Remarque: Il n'exécuter la requête si.
http://guides.rubyonrails.org/v3.2.8/active_record_querying.html#running-explain
Malheureusement dans les Rails 2.x ce est en fait assez dur. J'ai posté une question similaire sur un Débordement de Pile avant et terminé en train de creuser dans le code source de Rails à trouver un moyen. Il n'est tout simplement pas conçu de manière à permettre cela.
Ce que j'ai fait était de l'exécution de la requête dans une transaction que j'ai roulé en arrière, et pour la durée de l'opération de réglage de l'enregistreur à mon propre StringIO objet que j'ai pu lire après.
C'est à partir de la mémoire mais j'espère que vous comprenez, il suffit de l'ajuster si cela ne fonctionne pas:
Il est laid comme l'enfer et je n'ai jamais aimé (je l'ai enveloppé dans un
sql { Model. complex_scope.chained_complex_scope }
), mais ça a fonctionné pour moi (j'ai seulement utilisé bien que dans le développement, j'ai donc eu une certaine tolérance pour les erreurs)Pour les Rails 4 et au-dessus de l'utilisation
to_sql
comme expliqué dans la ci-dessus.Réponse originale à cette question
Il y a quelque temps, j'ai utilisé un plugin appelé sql_display pour cela.
AR#find
serait?to_sql
. Vous n'avez pas besoin de gemmes spéciales pour cela. Reportez-vous à cette stackoverflow.com/a/3814828/163203 réponse pour plus de détailsto_sql
. je ne me souviens pas le nuancée chose que je cherchais pour l'instant... je pense que j'essayais de trouver quelque chose qui dump sql complexes compter les choses.