Saya ingin melihat pernyataan SQL yang akan dihasilkan oleh Query ActiveRecord tertentu. Saya menyadari bahwa saya bisa mendapatkan informasi ini dari log setelah kueri dikeluarkan, tetapi saya bertanya-tanya apakah ada metode yang dapat dipanggil dan Permintaan ActiveRecord.
Sebagai contoh:
SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
Saya ingin membuka konsol irb dan memasang metode di bagian akhir yang akan menunjukkan SQL yang akan dihasilkan oleh kueri ini, tetapi tidak harus menjalankan kueri.
sumber
date
,: condition => [" > # {self.date}"],: limit => 1 ,: order => 'date
',: group => "date
") .show_generated_sql dan panggil ini metode construct_finder_sql.show_generated_sql
akan bekerja pada kumpulan data yang sudah diambil darifind
.construct_finder_sql
memang dihapusMirip dengan penger, tetapi bekerja kapan saja di konsol bahkan setelah kelas dimuat dan logger telah di-cache:
Untuk Rails 2:
Untuk Rails 3.0.x:
Untuk Rails> = 3.1.0, ini sudah dilakukan secara default di konsol. Jika terlalu berisik dan Anda ingin mematikannya, Anda dapat melakukan:
sumber
rails console
. Apakah ini hanya berfungsi untuk irb yang dimuat langsung dari shell? (atau dipindahkan untuk rel 3?)environment.rb
.. ..if "irb" == $0;ActiveRecord::Base.logger = Logger.new(STDOUT);end
dapatkan ini dari komentar di http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do -it-s-thingTempelkan suatu
puts query_object.class
tempat untuk melihat jenis objek yang Anda kerjakan, kemudian cari dokumennya.Misalnya, di Rails 3.0, penggunaan cakupan
ActiveRecord::Relation
yang memiliki#to_sql
metode. Sebagai contoh:Kemudian, di suatu tempat Anda dapat melakukan:
sumber
includes
dalam relasi AndaIni mungkin pertanyaan lama tapi saya menggunakan:
The
explain
Metode akan memberikan pernyataan yang cukup SQL rinci tentang apa yang terjadi untuk melakukansumber
cukup gunakan
to_sql
metode dan itu akan menampilkan query sql yang akan dijalankan. itu bekerja pada relasi rekaman aktif.ketika melakukannya
find
, itu tidak akan berfungsi, jadi Anda harus menambahkan id itu secara manual ke kueri atau menjalankannya menggunakan where.sumber
Inilah yang biasanya saya lakukan untuk mendapatkan SQL yang dihasilkan di konsol
Anda harus melakukan ini saat pertama kali memulai konsol, jika Anda melakukan ini setelah Anda mengetik beberapa kode, sepertinya tidak berfungsi.
Tidak dapat benar-benar mengambil kredit untuk ini, menemukannya lama sekali dari blog seseorang dan tidak dapat mengingat milik siapa.
sumber
Buat file .irbrc di direktori home Anda dan tempel ini di:
Itu akan menampilkan pernyataan SQL ke sesi irb Anda saat Anda pergi.
EDIT: Maaf itu masih akan mengeksekusi kueri, tapi yang paling dekat yang saya tahu.
EDIT: Sekarang dengan arel, Anda dapat membangun cakupan / metode selama objek mengembalikan ActiveRecord :: Relation dan memanggil .to_sql di atasnya dan itu akan mengeluarkan sql yang akan dieksekusi.
sumber
Cara khas saya untuk melihat apa yang digunakan sql adalah dengan memperkenalkan "bug" di sql, lalu Anda akan mendapatkan pesan kesalahan yang dimuntahkan ke logger normal (dan layar web) yang memiliki sql tersebut. Tidak perlu mencari ke mana arah stdout ...
sumber
Coba plugin show_sql . Plugin memungkinkan Anda untuk mencetak SQL tanpa menjalankannya
sumber
Anda bisa mengubah metode log koneksi untuk memunculkan pengecualian, mencegah kueri dijalankan.
Ini peretasan total, tetapi tampaknya berhasil untuk saya (Rails 2.2.2, MySQL):
sumber
Di Rails 3 Anda dapat menambahkan baris ini ke config / environment / development.rb
Namun itu akan mengeksekusi kueri. Tapi setengahnya mendapat jawaban:
sumber