Como mostrar consultas SQL rodando no console Rails?

115

Quando executo consultas (por exemplo, MyModel.where(...)ou record.associated_things) no console, como posso ver as consultas reais do banco de dados sendo executadas para obter mais compreensão do que está acontecendo?

randombits
fonte
Andrew, se você também precisar executar comandos no broweser, pode usar github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk
Veja também esta resposta: stackoverflow.com/a/1576221/446106
mwfearnley

Respostas:

249

Rails 3+

Insira esta linha no console:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Rails 2

Insira esta linha no console:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
John Topley
fonte
Perfeito, exatamente o que eu precisava. Tem alguma recomendação de onde ir para encontrar pequenos truques como esses documentados?
randombits
2
Isso funciona para rails 3+, mas não 2, consulte stackoverflow.com/a/1576221 se você ainda estiver lá :)
rogerdpack
E para desativá-lo novamente: ActiveRecord::Base.logger = nil
Hula_Zell
Já estive aqui tantas vezes, quando digito "rails" no cromo, ele exibe esta página como o resultado principal
23tux
33

No Rails 3+ você pode usar o to_sqlmétodo ActiveRecord :: Relation :

User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"id\" = 3"
Abhi
fonte
25

Existe o .explainmétodo no Rails 4.
( .to_sqlfunciona também, mas não mostra inclui)

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
lagos são
fonte
Levei muito tempo para encontrar a .explainvontade do trabalho e não .to_sql. E .explainainda não fornece consulta sql em formato raw que posso rodar no console pg. Mas eu precisava da consulta bruta para explicar e analisar. Eu acho que vai ter a ver com explicar por enquanto.
abhishek77 em
4

Recentemente, você pode usar isto:

https://github.com/dejan/rails_panel

Ele consiste em um complemento do painel do console do desenvolvedor para cromo e um arquivo gem que precisa ser adicionado ao Gemfile do seu aplicativo como este:

group :development do
  gem 'meta_request'
end

Em seguida, execute novamente:

bundle install

Reinicie seu aplicativo, abra-o e inicie o console do desenvolvedor, e você deve vê-lo assim: insira a descrição da imagem aqui

Aleksandar Pavić
fonte
0

Eu prefiro configurar o nível de logger em config/application.rb:

config.after_initialize do
  Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end

Na produção, meu ENV['LOG_LEVEL']será definido como o valor de Logger::INFOe na minha máquina local será Logger::DEBUG.

Huy Vo
fonte