Me gustaría ver la declaración SQL que generará una consulta ActiveRecord determinada. Reconozco que puedo obtener esta información del registro después de que se haya emitido la consulta, pero me pregunto si hay un método al que se pueda llamar y ActiveRecord Query.
Por ejemplo:
SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
Me gustaría abrir la consola irb y agregar un método al final que mostraría el SQL que generará esta consulta, pero no necesariamente ejecutará la consulta.
fuente
date
,: conditions => [" > # {self.date}"],: limit => 1 ,: order => 'date
',: group => "date
") .show_generated_sql y haga que esto llame al método construct_finder_sql.show_generated_sql
actuará sobre un conjunto de datos ya recuperado defind
.construct_finder_sql
se eliminaSimilar a Penger, pero funciona en cualquier momento en la consola, incluso después de que se hayan cargado las clases y el registrador se haya almacenado en caché:
Para rieles 2:
Para Rails 3.0.x:
Para Rails> = 3.1.0 esto ya se hace de forma predeterminada en las consolas. En caso de que sea demasiado ruidoso y desee apagarlo , puede hacer:
fuente
rails console
. ¿Funciona solo para irb cargado directamente desde el shell? (¿O se eliminó para los rieles 3?)environment.rb
..if "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end
..lo obtuve de los comentarios en http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do -it-s-thingPegue un
puts query_object.class
lugar para ver con qué tipo de objeto está trabajando, luego busque los documentos.Por ejemplo, en Rails 3.0, los alcances usan
ActiveRecord::Relation
que tiene un#to_sql
método. Por ejemplo:Entonces, en algún lugar puedes hacer:
fuente
includes
en su relaciónEsta puede ser una pregunta antigua, pero yo uso:
El
explain
método dará una declaración SQL bastante detallada sobre lo que va a hacerfuente
solo use el
to_sql
método y generará la consulta SQL que se ejecutará. funciona en una relación de registro activa.al hacerlo
find
, no funcionará, por lo que deberá agregar esa identificación manualmente a la consulta o ejecutarla usando where.fuente
Esto es lo que suelo hacer para generar SQL en la consola
Tienes que hacer esto cuando inicias la consola por primera vez, si lo haces después de haber escrito algún código, no parece funcionar
Realmente no puedo tomar el crédito por esto, lo encontré hace mucho tiempo en el blog de alguien y no puedo recordar de quién es.
fuente
Cree un archivo .irbrc en su directorio de inicio y péguelo en:
Eso generará declaraciones SQL en su sesión de irb a medida que avanza.
EDITAR: Lo siento, todavía ejecutará la consulta, pero es lo más cercano que conozco.
EDITAR: Ahora con arel, puede construir alcances / métodos siempre que el objeto devuelva ActiveRecord :: Relation y llame a .to_sql en él y saldrá el sql que se va a ejecutar.
fuente
Mi forma típica de ver qué sql usa es introducir un "error" en el sql, luego aparecerá un mensaje de error en el registrador normal (y la pantalla web) que tiene el sql en cuestión. No es necesario encontrar a dónde va stdout ...
fuente
Prueba el complemento show_sql . El complemento le permite imprimir el SQL sin ejecutarlo
fuente
Puede cambiar el método de registro de la conexión para generar una excepción, evitando que se ejecute la consulta.
Es un truco total, pero parece funcionar para mí (Rails 2.2.2, MySQL):
fuente
En Rails 3 puedes agregar esta línea a config / environment / development.rb
Sin embargo, ejecutará la consulta. Pero la mitad fue respondida:
fuente