Подтвердить что ты не робот

Как показать SQL-запросы в консоли Rails?

Когда я запускаю запросы (например, MyModel.where(...) или record.associated_things) в консоли, как я могу просмотреть текущие запросы к базе данных, чтобы я мог лучше понять, что происходит?

4b9b3361

Ответ 1

Рельсы 3+

Введите эту строку в консоли:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Рельсы 2

Введите эту строку в консоли:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)

Ответ 2

В Rails 3+ вы можете использовать метод ActiveRecord:: Relations to_sql:

User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"id\" = 3"

Ответ 3

В Rails 4. существует метод .explain.
(.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

Ответ 4

С недавнего времени вы можете использовать это:

https://github.com/dejan/rails_panel

Он состоит из дополнения панели консоли разработчика для хром и gem файла, которые необходимо добавить в ваше приложение Gemfile следующим образом:

group :development do
  gem 'meta_request'
end

Затем снова запустите:

bundle install

Перезагрузите приложение, откройте его и запустите консоль разработчика, и вы увидите следующее: введите описание изображения здесь

Ответ 5

Специальные запросы ActiveRecord в консоль не работает. В любом случае изменить это поведение?

Вы уверены в этом? Я все время использую консоль для таких вещей. Для среды разработки поведение по умолчанию заключается в регистрации запросов к development.log. Вы уверены, что не изменили свой уровень журнала в своей среде?

Вы видите следующее в development.rb?

config.log_level = :debug

Ответ 6

Я предпочитаю устанавливать уровень ведения журнала в 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.