Je voudrais voir l'instruction SQL qu'une requête ActiveRecord donnée générera. Je reconnais que je peux obtenir ces informations à partir du journal une fois la requête émise, mais je me demande s'il existe une méthode qui peut être appelée et ActiveRecord Query.
Par exemple:
SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
Je voudrais ouvrir la console irb et appliquer une méthode à la fin qui montrerait au SQL que cette requête générera, mais n'exécutera pas nécessairement la requête.
la source
date
,: conditions => [" > # {self.date}"],: limit => 1 ,: order => 'date
',: group => "date
") .show_generated_sql et faites appeler la méthode construct_finder_sql.show_generated_sql
agira sur un ensemble de données déjà récupéréfind
.construct_finder_sql
est en effet suppriméSimilaire à penger, mais fonctionne à tout moment dans la console même après le chargement des classes et la mise en cache de l'enregistreur:
Pour les rails 2:
Pour les rails 3.0.x:
Pour Rails> = 3.1.0, cela est déjà fait par défaut dans les consoles. Dans le cas où il est trop bruyant et que vous souhaitez l' éteindre, vous pouvez faire:
la source
rails console
. Cela fonctionne-t-il uniquement pour irb chargé directement depuis le shell? (ou a-t-il été retiré pour les rails 3?)environment.rb
.. ..if "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end
obtenu ceci à partir des commentaires dans http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do -it-s-thingCollez un
puts query_object.class
quelque part pour voir avec quel type d'objet vous travaillez, puis recherchez les documents.Par exemple, dans Rails 3.0, les étendues utilisent
ActiveRecord::Relation
qui a une#to_sql
méthode. Par exemple:Ensuite, quelque part vous pouvez faire:
la source
includes
dans votre relationC'est peut-être une vieille question mais j'utilise:
La
explain
méthode donnera une instruction SQL assez détaillée sur ce qu'elle va fairela source
utilisez simplement la
to_sql
méthode et il affichera la requête SQL qui sera exécutée. cela fonctionne sur une relation d'enregistrement active.lorsque vous le faites
find
, cela ne fonctionnera pas, vous devrez donc ajouter cet identifiant manuellement à la requête ou l'exécuter en utilisant where.la source
C'est ce que je fais habituellement pour générer SQL dans la console
Vous devez le faire lorsque vous démarrez la console pour la première fois, si vous faites cela après avoir tapé du code, cela ne semble pas fonctionner
Je ne peux pas vraiment m'en attribuer le mérite, je l'ai trouvé il y a longtemps sur le blog de quelqu'un et je ne me souviens plus à qui il appartient.
la source
Créez un fichier .irbrc dans votre répertoire personnel et collez-le dans:
Cela produira des instructions SQL dans votre session irb au fur et à mesure.
EDIT: Désolé, cela exécutera toujours la requête, mais c'est le plus proche que je connaisse.
EDIT: Maintenant avec arel, vous pouvez créer des portées / méthodes tant que l'objet retourne ActiveRecord :: Relation et appelle .to_sql dessus et il mettra le sql qui va être exécuté.
la source
Ma façon typique de voir quel sql il utilise est d'introduire un "bogue" dans le sql, puis vous obtiendrez un message d'erreur envoyé à l'enregistreur normal (et à l'écran Web) qui a le sql en question. Pas besoin de savoir où va stdout ...
la source
Essayez le plugin show_sql . Le plugin vous permet d'imprimer le SQL sans l'exécuter
la source
Vous pouvez modifier la méthode du journal de la connexion pour déclencher une exception, empêchant l'exécution de la requête.
C'est un hack total, mais cela semble fonctionner pour moi (Rails 2.2.2, MySQL):
la source
Dans Rails 3, vous pouvez ajouter cette ligne au fichier config / environnements / development.rb
Il exécutera cependant la requête. Mais la moitié a répondu:
la source