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?
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)
Dans Rails 3+, vous pouvez utiliser ActiveRecord :: Relation's to_sql
méthode:
User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 3"
Il y a un .explain
méthode dans Rails 4.
(.to_sql
fonctionne aussi, mais ne montrera pas les inclusions)
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
Depuis récemment, vous pouvez utiliser ceci:
https://github.com/dejan/Rails_panel
Il se compose d'un module complémentaire de console de développeur pour Chrome et d'un fichier gem qui doit être ajouté au Gemfile de votre application comme ceci:
group :development do
gem 'meta_request'
end
Puis exécutez à nouveau:
bundle install
Redémarrez votre application, ouvrez-la et lancez la console développeur, et vous devriez la voir comme ceci:
Je préfère configurer le niveau de l'enregistreur dans config/application.rb
:
config.after_initialize do
Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end
En production mon ENV['LOG_LEVEL']
sera défini sur la valeur de Logger::INFO
et sur ma machine locale ce sera Logger::DEBUG
.