เมื่อฉันเรียกใช้แบบสอบถาม (เช่นMyModel.where(...)
หรือrecord.associated_things
) ในคอนโซลฉันจะเห็นการสืบค้นฐานข้อมูลจริงได้อย่างไรเพื่อให้ฉันเข้าใจมากขึ้นว่าเกิดอะไรขึ้น
เมื่อฉันเรียกใช้แบบสอบถาม (เช่นMyModel.where(...)
หรือrecord.associated_things
) ในคอนโซลฉันจะเห็นการสืบค้นฐานข้อมูลจริงได้อย่างไรเพื่อให้ฉันเข้าใจมากขึ้นว่าเกิดอะไรขึ้น
คำตอบ:
ป้อนบรรทัดนี้ในคอนโซล:
ActiveRecord::Base.logger = Logger.new(STDOUT)
ป้อนบรรทัดนี้ในคอนโซล:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
ActiveRecord::Base.logger = nil
ใน Rails 3+ คุณสามารถใช้to_sql
เมธอดของ ActiveRecord :: Relation :
User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 3"
มี.explain
วิธีการใน Rails 4
( .to_sql
ใช้ได้เช่นกัน แต่จะไม่แสดงรวม)
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
.explain
.to_sql
และ.explain
ยังไม่มีแบบสอบถาม sql ในรูปแบบดิบซึ่งฉันสามารถเรียกใช้ใน pg console แต่ฉันต้องการแบบสอบถามดิบเพื่ออธิบายและวิเคราะห์ ฉันเดาว่าจะต้องอธิบายในตอนนี้
เมื่อเร็ว ๆ นี้คุณสามารถใช้สิ่งนี้:
https://github.com/dejan/rails_panel
ประกอบด้วยส่วนเสริมแผงคอนโซลสำหรับนักพัฒนาซอฟต์แวร์สำหรับ chrome และไฟล์ gem ที่ต้องเพิ่มลงในGemfileของแอปพลิเคชันของคุณดังนี้:
group :development do
gem 'meta_request'
end
จากนั้นเรียกใช้อีกครั้ง:
bundle install
รีสตาร์ทแอปพลิเคชันของคุณเปิดและเปิดคอนโซลนักพัฒนาและคุณจะเห็นสิ่งนี้:
เริ่มต้นจาก Rails 6 มีวิธีที่สะดวกกว่า: เพียงเพิ่มActiveRecord::Base.verbose_query_logs = true
ในคอนโซลแล้วคุณจะเห็นการเรียก SQL ทั้งหมดและตำแหน่งที่ถูกเรียก ข้อมูลเพิ่มเติมhttps://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
ฉันต้องการตั้งค่าระดับคนตัดไม้ในconfig/application.rb
:
config.after_initialize do
Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end
ในการผลิตของฉันENV['LOG_LEVEL']
จะถูกตั้งค่าของและเครื่องท้องถิ่นของฉันมันจะเป็นLogger::INFO
Logger::DEBUG