Lorsque j'exécute des requêtes (par exemple MyModel.where(...)ou record.associated_things) dans la console, comment puis-je voir les requêtes de base de données en cours d'exécution afin de mieux comprendre ce qui se passe?
Lorsque j'exécute des requêtes (par exemple MyModel.where(...)ou record.associated_things) dans la console, comment puis-je voir les requêtes de base de données en cours d'exécution afin de mieux comprendre ce qui se passe?
Réponses:
Entrez cette ligne dans la console:
ActiveRecord::Base.logger = Logger.new(STDOUT)Entrez cette ligne dans la console:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)ActiveRecord::Base.logger = nil
                    Il y a la .explainméthode dans Rails 4. 
( .to_sqlfonctionne aussi, mais ne montrera pas inclus)
Category.includes(:products).explain
=> EXPLAIN for: SELECT "categories".* FROM "categories" 0|0|0|SCAN TABLE categories
EXPLAIN for: SELECT "categories_products".* FROM "categories_products" WHERE "categories_products"."category_id" IN (1, 2) 0|0|0|SCAN TABLE categories_products
EXPLAIN for: SELECT "products".* FROM "products" WHERE "products"."id" IN (1, 2, 3, 4, 5, 6, 7) 0|0|0|SEARCH TABLE products USING INTEGER PRIMARY KEY (rowid=?) 0|0|0|EXECUTE LIST SUBQUERY 1.explainvolonté de faire le travail et non .to_sql. Et .explainne fournit toujours pas de requête SQL au format brut que je peux exécuter dans la console pg. Mais j'avais besoin de la requête brute pour expliquer et analyser. Je suppose que cela aura à voir avec expliquer pour l'instant.
                    Depuis récemment, vous pouvez utiliser ceci:
https://github.com/dejan/rails_panel
Il se compose d'un module complémentaire de panneau de console de développeur pour Chrome et d'un fichier gem qui doit être ajouté au fichier Gemfile de votre application comme ceci:
group :development do
  gem 'meta_request'
endPuis exécutez à nouveau:
bundle installRedémarrez votre application, ouvrez-la et lancez la console développeur, et vous devriez la voir comme ceci:

À partir de Rails 6, il existe une approche plus pratique: ajoutez simplement la ActiveRecord::Base.verbose_query_logs = trueconsole et vous verrez tous les appels SQL et les endroits où il a été appelé. Plus d'infos https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
Je préfère configurer le niveau de journalisation dans config/application.rb:
config.after_initialize do
  Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
endLors de la production, mon ENV['LOG_LEVEL']sera réglé sur la valeur de Logger::INFOet sur ma machine locale, ce sera le cas Logger::DEBUG.