Gostaria de ver a instrução SQL que uma determinada consulta ActiveRecord irá gerar. Reconheço que posso obter essas informações do log após a consulta ter sido emitida, mas estou me perguntando se há um método que pode ser chamado e ActiveRecord Query.
Por exemplo:
SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
Gostaria de abrir o console do irb e adicionar um método no final que mostre o SQL que essa consulta irá gerar, mas não necessariamente executará a consulta.
fonte
date
,: conditions => [" > # {self.date}"],: limit => 1 ,: order => 'date
',: group => "date
") .show_generated_sql e faça com que este chame o método construct_finder_sql.show_generated_sql
estará atuando em um conjunto de dados já recuperado defind
.construct_finder_sql
foi realmente removidoSemelhante ao penger, mas funciona a qualquer momento no console, mesmo depois que as classes foram carregadas e o logger foi armazenado em cache:
Para Rails 2:
Para Rails 3.0.x:
Para Rails> = 3.1.0, isso já é feito por padrão nos consoles. Caso seja muito barulhento e você queira desligá-lo, você pode:
fonte
rails console
. Isso funciona apenas para irb carregado diretamente do shell? (ou foi removido para os trilhos 3?)environment.rb
..if "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end
..com base nos comentários em http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do -é-coisaCole em
puts query_object.class
algum lugar para ver com que tipo de objeto está trabalhando e, em seguida, consulte os documentos.Por exemplo, no Rails 3.0, os escopos usam o
ActiveRecord::Relation
que tem um#to_sql
método. Por exemplo:Então, em algum lugar você pode fazer:
fonte
includes
em seu parenteEsta pode ser uma pergunta antiga, mas eu uso:
O
explain
método fornecerá uma instrução SQL bastante detalhada sobre o que irá fazerfonte
apenas use o
to_sql
método e ele irá gerar a consulta sql que será executada. funciona em uma relação de registro ativo.ao fazer
find
isso, não funcionará, então você precisará adicionar esse id manualmente à consulta ou executá-lo usando where.fonte
Isso é o que eu geralmente faço para obter o SQL gerado no console
Você tem que fazer isso ao iniciar o console pela primeira vez, se fizer isso depois de digitar algum código, não parece funcionar
Não consigo levar o crédito por isso, encontrei há muito tempo no blog de alguém e não consigo lembrar de quem é.
fonte
Crie um arquivo .irbrc em seu diretório inicial e cole-o em:
Isso produzirá instruções SQL em sua sessão irb conforme você avança.
EDIT: Desculpe, ainda vou executar a consulta, mas é o mais próximo que eu conheço.
EDIT: Agora com arel, você pode construir escopos / métodos, desde que o objeto retorne ActiveRecord :: Relation e chame .to_sql nele e ele irá colocar o sql que vai ser executado.
fonte
Minha maneira típica de ver que sql ele usa é introduzir um "bug" no sql, então você receberá uma mensagem de erro enviada para o logger normal (e a tela da web) que tem o sql em questão. Não há necessidade de descobrir para onde o stdout está indo ...
fonte
Experimente o plugin show_sql . O plugin permite que você imprima o SQL sem executá-lo
fonte
Você pode alterar o método de registro da conexão para gerar uma exceção, evitando que a consulta seja executada.
É um hack total, mas parece funcionar para mim (Rails 2.2.2, MySQL):
fonte
No Rails 3, você pode adicionar esta linha ao config / environment / development.rb
No entanto, ele executará a consulta. Mas metade foi respondida:
fonte