Когда я запускаю запросы (например, 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
В .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. Но мне нужен был необработанный запрос, чтобы объяснить и проанализировать. Думаю, пока придется заняться объяснением.
С недавнего времени вы можете использовать это:
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
В процессе производства my ENV['LOG_LEVEL']
будет установлено значение, Logger::INFO
а на моем локальном компьютере будет Logger::DEBUG
.